home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
utility
/
vdifx110.lzh
/
INTERNA.TXT
< prev
next >
Wrap
Text File
|
1990-02-20
|
3KB
|
80 lines
Beschreibung des VDI-Fehlers, der durch VDI-FIX behoben wird
########################################################################
Die VDI_Workstations werden intern als verkettete, sortierte Liste
verwaltet. Der Fehler tritt auf, wenn Lücken in der Liste entstehen,
jeder neue VDI-Block wird dann fasch einsortiert und es wird immer
dasselbe VDI-Handle vergeben.
Bei Einhängen wird folgendermaßen vorgegangen. Block 1 wird auf Handle
1, Block 2 auf Handle 2 usw. getestet. Wenn kein Block fehlt, wird ein
Block angehängt, wenn einer fehlt, so wird dieser neu vergeben.
Und genau da lauert der Fehler ! Der neue Block wird hinter den
gefundenen Block gehangen, so daß beim nächsten Öffnen einer WK wieder
derselbe Handle als fehlend festgestellt wird usw..
Am Besten ein Beispiel :
Vorgang Reihenfolge der Blöcke
-------------------------------------------------------
Existieren die WKs 1,2,3,4 1,2,3,4
Nun schließt WK 3 1,2,4
Prg A öffnet eine WK und
erhält die 3,die ist aber
falsch eingehängt 1,2,4,3
Prg B öffnet auch eine WK
und erhält wieder die 3 1,2,4,3,3
Prg A und Prg B arbeiten als auf derselben Workstation und die Aufrufe
zum setzen der Parameter laufen durcheinander. Setz Prg A GrosseSchrift
und danach Prg B KleineSchrift, so werden auch die Ausgaben von Prg A
in kleiner Schrift geschehen usw...
Und dies alles nur, weil der Block dahinter, statt davor gehängt wurde !
########################################################################
Hier nun der Code für v_opnvwk aus TOS 1.0 - 06.02.86 - $FCD4D8
TOS 1.4 - 06.04.89 - $FCE22A
TOS 1.6 - 29.07.89 - $E0E454
TOS 030 - 23.05.89 - $E085BC
MALLOC($134)
move.l D0,A5 ; new = Malloc($134)
...
Abbruch wenn kein Speicher erhalten
...
move.w #1,D7 ; handle = 1
move.l BASE,A4 ; wk = BASE
bra Test ; while(handle == wk->handle) {
Loop: addq #1,D7 ; handle++;
tst.l 64(A4) ; if (!wk->next)
beq End ; break;
move.l 64(A4),A4 ; wk = wk->next;
Test: cmp.w 40(A4),D7 ; /* In C eine WHILE-Schleife */
beq Loop ; }
End: tst.l 64(A4) ; if (!wk->next)
bne InsertWK ; {
move.l A5,D0 ; wk->next = new;
move.l D0,64(A4) ;
... ; new->next= 0L;
clr.l 64(A5) ; }
bra Continue ; else
Insert: move.l 64(A4),A3 ; {
move.l A5,D0 ; hilf = wk->next;
move.l D0,64(A4) ; wk->next = new;
... ; new->next= hilf;
move.l A3,64(A5) ; }
Cont: ... ;
move.w D7,D0 ;
... ;
move.w D0,40(A5) ; new->handle = handle;
...
########################################################################
Karsten Isakovic
Wilmersdorferstr.82
1000 Berlin
Mailbox : Maus Münster, Maus München, Parrot Berlin