--- joko/Uni/BSArch/02/bakery.c 2006/05/26 10:50:19 1.1 +++ joko/Uni/BSArch/02/bakery.c 2006/05/26 11:29:41 1.3 @@ -0,0 +1,69 @@ + +#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; + + /* Datenstruktur "erzeugen" */ + *sec = malloc(sizeof(struct _crit_sec)); + + /* Datenstruktur mit "0" initialisieren */ + for (i = 0; i < MAX_THREADS; i++) { + (*sec)->choosing[i] = 0; + (*sec)->number[i] = 0; + } + +} + +void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) { + + /* Datenstruktur freigeben */ + 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; +}