XSt„ng av har kostat mig
mycket tankem”da, d† det faktiskt inte „r dokumenterat
vad som h„nder under en normal avst„ngning.
OS/2 har normalt tv† olika avst„ngnings API:
-
DosShutdown st„nger alla ”ppna filer, flushar alla filsystem
buffertar och avmonterar alla filsystem. Det h„nder efter tryckning
p† Ctrl-Alt-Del. Ingen applikation „r r„tt st„ngd
och Skrivbordet „r inte sparat.
-
WinShutdownSystem „r Presentation Manager API, som st„nger
alla f”nster, sparar Skrivbordet och slutligen anropar DosShutdown.
Precis den vanliga avst„ngningsprocessen, som utf”rs n„r
du v„ljer "St„ng av..." fr†n Skrivbordets meny eller respektive
ikon fr†n Snabbpanelen eller WarpCenter.
Problemet „r att det finns ingen funktion "mellan" dessa tv†.
Om du kallar p† DosShutdown sparas inte Skrivbordsdata. Och
om du kallar WinShutdownSystem s† f†r du den vanliga
avst„ngningen utan n†gon ytterligare chans att ingripa. S†
jag tvingades att skriva om ett komplett nytt WinShutdownSystem. Det var
ganska sv†rt, eftersom IBM knappt f”rklarat n†got om vad
som verkligen h„nder under WinShutdownSystem.
Notera: I XFolder delar "Ut”kad Avst„ngning" och "Omstarta
Skrivbord" samma kod; de bara skiljer sig i vad som h„nder efter det
att alla f”nster har st„ngts. Jag kommer d„rf”r anv„nda
termen "XSt„ng av" i f”ljande f”rklaringar f”r b†da
funktionerna om inte annat anges.
XSt„ng av „r integrerat i Skrivbordet och litar
starkt p† XFolderklass ers„ttningar. Jag har avsiktligt inte
satt XSt„ng av koden i en separat .EXE fil av tv† sk„l:
f”r det f”rsta XSt„ng av beh”ver tillg†ng
till Skrivbordets interna data, som „r bara tillg„ngligt fr†n
SOM sammanhanget; f”r det andra vill jag f”rhindra folk fr†n
att anv„nda XSt„ng av separat utan att ha XFolderklasserna
installerade, d„rf”r detta skulle allvarligt kunna skada Skrivbordet.
XSt„ng av litar till XFldObjekt ers„ttningsklassen och XFolder
tr†d Worker, som tillsammans h†ller reda p† Skrivbordets
interna data.
F”r att f”rst† vad XSt„ng av g”r „r
det n”dv„ndigt att f”rst† hur Skrivbordet hanterar
sina objekt internt. Varje objekt som blir relevant f”r Skrivbordet,
genom att ing† i en mapp, fr†ga om dess inst„llningar,
starta ett program eller vad som helst, „r -- med Skrivbords terminologi
-- "v„ckt" av systemet, vilket inneb„r att det existerar som
ett SOM objekt i minnet.
Skrivbordet placerar bara mycket s„llan objekt tillbaka i s”mn,
fast„n det skulle fris„tta associerat minne och lagra objektets
data tillbaka till h†rddisken. Detta har tv† konsekvenser:
-
Det finns alltid m†nga fler v„ckta objekt i ditt system
„n du kan f”rest„lla dig, d„rf”r att de flesta
„r osynliga. Žven efter st„ngning av en ”ppen mapp „r
objekten d„rinne fortfarande v„ckta. Det snabbar p† fyllningen
av mappen n„r den ”ppnas n„sta g†ng. D„rf”r
„ter Skrivbordet mer och mer av ditt minne med varje mapp du ”ppnar.(Om
du sl†r p† loggfilen f”r XSt„ng av, kan du se
hur m†nga v„ckta objekt som r„ddades genom XSt„ng av.
Ofta flera hundra objekt „ven om XSt„ng av inte r„ddar
alla v„ckta objekt utan bara avkomlingar av WPFolder och WPAbstract.
P† "Interna" sidan i Skrivbordets inst„llningsblock (Obs! Ej
Skrivbord objektet) kan du se hur m†nga objekt som „r v„ckta).
-
En „ndring i objektets data har ibland bara effekt p† SOM objektet
i minnet, men „r inte alltid sparat till h†rddisken eller OS2.INI/OS2SYS.INI.
Skrivbordet kan d„rf”r f† problem om du g”r stora
f”r„ndringar, som att flytta en mapp med m†nga abstrakta
objekt och inte st„nga av korrekt: den fysiska datafilen p†
h†rddisken och Skrivbordets registrering skiljer sig d†.
Detta „r vad XSt„ng av beh”ver XFldObject klasserna
till, som ers„tter WPObject. Varje g†ng ett objekt v„cks
anropar Skrivbordet flera metoder (bland dem wpInitData och wpObjectReady).
XFldObject ”verskuggar dessa och skickar objektadressen i minnet till
Worker tr†den, som sedan uppdaterar XFolders interna lista ”ver
alla v„ckta objekt. S† vitt jag vet, finns det inget annat s„tt
att avg”ra vilka objekt som „r v„ckta; i alla fall finns
det ingen dokumenterad API f”r att r„kna dem.
N„r XSt„ng av „r initierad och bekr„ftad,
startas f”rst tv† nya tr†dar f”r den, som g†r
parallellt med vanliga Skrivbordstr†dar: den huvudsakliga "Avst„ngningstr†den"
med meddelandek” f”r statusf”nster och "Uppdateringstr†den",
som ”vervakar OS/2 F”nsterlista och skickar meddelanden till avst„ngningstr†den,
om att statusf”nstret beh”ver uppdateras. S† st„ngning
av alla ”ppna f”nster „r en ganska komplicerad interaktiv
process mellan dessa tv† tr†dar: Avst„ngningstr†den
st„nger ett f”nster och slumrar sedan in tills uppdateringstr†den
har uppt„ckt en f”r„ndring i F”nsterlistan (vilket
inneb„r att f”nstret har framg†ngsrikt st„ngts) och
skickar ett meddelande tillbaka till Avst„ngningstr†den, som
sedan i sin tur st„nger n„sta f”nster, tills alla f”nster
„r st„ngda.
N„r alla f”nster „r st„ngda, s† avslutas Uppdateringstr†den.
Avst„ngningstr†den g†r i genom listan ”ver v„ckta
objekt (som beskrevs ovan) och tvingar deras data att sparas till INI filer
eller till h†rddisken genom att anropa varje objekts wpSaveImmediate
metod. Detta g”rs bara f”r WPAbstract och WPFolder avkomlingar,
d„rf”r enligt min erfarenhet sparar alla andra klasser sina data
synkront. (Jag har f”rs”kt spara alla WPFileSystem avkomlingar
en g†ng och det orsakade att massor av ut”kade attribut skapades
f”r varje fil som n†gonsin v„ckts av Skrivbordet.)
Slutligen, beroende p† vilken handling som ”nskas, g”r
Avst„ngningstr†den ett av f”ljande:
-
Om du v„ljer "Omstarta Skrivbord", utf”r Avst„ngingstr†den
helt enkelt DosExit(EXIT_PROCESS, 0). Eftersom XFolder „r en
del av Skrivbordsprocessen och alla delar av Skrivbordet g†r i denna
enda process (det andra exemplet av PMSHELL.EXE), kommer det att avsluta
hela Skrivbordet. Skalprocessen (det f”rsta exemplet av PMSHELL.EXE)
kommer sedan att starta om Skrivbordet automatiskt.
-
Om du valt "St„ng av..." med "Omstarta efter†t", s†
sparar XSt„ng av INI filerna till h†rddisken. Det „r
n”dv„ndigt, d„rf”r DosShutdown, som anropas
efter†t, sparar dem inte. (Jag gissar det beror p† att INI
filens API tillh”r Presentation Manager.) Eftersom PM INI filens API
f”rhindrar enkel st„ngning av anv„ndar- och systemprofiler
(som inte skriver sina data till h†rddisken f”r alla andra profiler),
kopierar XFolder dem till tv† tempor„ra profiler, tar bort originalen
och sedan byter namn p† de tempor„ra profilerna till originalens
namn. Efter DosShutdown ("Fris„ttande av filsystem...") omstartas
systemet via ett anrop till DOS.SYS drivrutinen. Denna funktion „r
dokumenterad i EDM/2 volum 5, nummer
9.
-
Om du valt "St„ng av..." och INTE "Omstarta efter†t",
kopplar efter DosShutdown XSt„ng av ur f”nsterlistan
och sedan blockerar systemet genom anropa DosEnterCritSec och kvarst†r
i en loop. N„r alla filsystem „r st„ngda, „r ingen
annan handling m”jlig utom att st„nga av datorn eller trycka
p† Ctrl-Alt-Del.