--- joko/Uni/BSArch/02/bakery.c 2006/05/26 11:08:12 1.2 +++ joko/Uni/BSArch/02/bakery.c 2006/05/26 11:29:41 1.3 @@ -2,6 +2,16 @@ #include #include "bakery.h" +int maxValueInList(int list[], int list_length) { + int i; + int max_value = 0; + for (i = 0; i < list_length; i++) { + if (list[i] > max_value) + max_value = list[i]; + } + return max_value; +} + void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) { int i; @@ -23,3 +33,37 @@ free(sec); } + +void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) { + + int j; + + /* Beginn der Ticket-ID Berechnung */ + sec->choosing[ThId] = 1; + + /* Neue Ticket-ID berechnen */ + sec->number[ThId] = maxValueInList(sec->number, MAX_THREADS) + 1; + + /* Ende der Ticket-ID Berechnung */ + sec->choosing[ThId] = 0; + + /* Alle Threads durchlaufen */ + for (j = 0; j < MAX_THREADS; j++) { + + /* warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */ + while (sec->choosing[j] == 1); + + while ( (sec->number[j] != 0) && + ( + (sec->number[j] < sec->number[ThId]) || + ((sec->number[j] == sec->number[ThId]) && j < ThId) + ) + ); + + } + +} + +void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) { + sec->number[ThId] = 0; +}