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 Lcken 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 fr 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 Mnster, Maus Mnchen, Parrot Berlin