Das Übertragen von Files wurde komplett neu überarbeitet. Jetzt wird auch der MD5 als Kriterium herangezogen, ob ein File existiert oder nicht.
Folgender Bug wurde am Server gefunden (der nach wie vor multithreaded ist) und behoben:
Beim Kicken eines Spielers muss das Handle in der Liste vorher kopiert, dann auf NULL gesetzt, der Lock freigegeben und schließlich auf die Beendigung des Threads gewartet werden. Wenn zum Beispiel in der WaitForSingleObject - Zeile statt hnd cln->hnd stehen würde und dieses erst nachher auf NULL gesetzt werden würde, würde der Main-Thread das Handle schon in der Zwischenzeit manipulieren können. Das ganze führt dann dazu, dass ein Thread ohne Beendigung weiterläuft und Speicher nicht freigegeben wird und das Programm stürzt im Endeffekt mit einer Exception ab (in genau der blöden Situation, wenn dem Thread die Zeitscheibe zwischen Freigabe und erneuten Anforderung des Locks entnommen wird).
HANDLE hnd = cln->hnd;
...
cln->hnd = NULL;
LOCKSRV(false);
WaitForSingleObject(hnd, INFINITE); //blockierender systemaufruf!
LOCKSRV(true);
Es muss leider vor dem WaitForSingleObject entsperrt werden, weil auch der 2. Thread sperren und entsperren kann und es sonst zu einem Deadlock kommen kann. (Thread1 wartet auf Beendigung von Thread2, Thread2 wartet auf Lock vom Thread1)
Sonntag, 18. Januar 2009
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen