--- joko/Uni/BSArch/02/bakery.c 2006/05/26 11:29:41 1.3 +++ joko/Uni/BSArch/02/bakery.c 2006/05/28 02:40:05 1.4 @@ -2,6 +2,7 @@ #include #include "bakery.h" +/* Hilfsfunktion, um höchsten Wert (integer) in einem Array zu bestimmen */ int maxValueInList(int list[], int list_length) { int i; int max_value = 0; @@ -12,6 +13,7 @@ return max_value; } +/* Initialisiert Struktur zur Verwaltung kritischer Abschnitte */ void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) { int i; @@ -19,7 +21,7 @@ /* Datenstruktur "erzeugen" */ *sec = malloc(sizeof(struct _crit_sec)); - /* Datenstruktur mit "0" initialisieren */ + /* Felder der Datenstruktur mit "0" initialisieren */ for (i = 0; i < MAX_THREADS; i++) { (*sec)->choosing[i] = 0; (*sec)->number[i] = 0; @@ -27,6 +29,7 @@ } +/* Gibt Speicher zur Verwaltung kritischer Abschnitte wieder frei */ void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) { /* Datenstruktur freigeben */ @@ -34,6 +37,7 @@ } +/* Eintritt in kritischen Abschnitt */ void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) { int j; @@ -41,7 +45,7 @@ /* Beginn der Ticket-ID Berechnung */ sec->choosing[ThId] = 1; - /* Neue Ticket-ID berechnen */ + /* Neue Ticket-ID berechnen und zuweisen */ sec->number[ThId] = maxValueInList(sec->number, MAX_THREADS) + 1; /* Ende der Ticket-ID Berechnung */ @@ -50,9 +54,10 @@ /* Alle Threads durchlaufen */ for (j = 0; j < MAX_THREADS; j++) { - /* warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */ + /* Warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */ while (sec->choosing[j] == 1); + /* Bakery Algorithmus: Warten, bis man an der Reihe ist (busy wait) */ while ( (sec->number[j] != 0) && ( (sec->number[j] < sec->number[ThId]) || @@ -64,6 +69,10 @@ } +/* Austritt aus kritischem Abschnitt */ void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) { + + /* Ticket löschen */ sec->number[ThId] = 0; + }