/[cvs]/joko/Uni/BSArch/02/bakery.c
ViewVC logotype

Contents of /joko/Uni/BSArch/02/bakery.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations)
Fri May 26 11:29:41 2006 UTC (18 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.2: +44 -0 lines
File MIME type: text/plain
+ My_EnterCriticalSection
+ My_LeaveCriticalSection

1
2 #include <stdlib.h>
3 #include "bakery.h"
4
5 int maxValueInList(int list[], int list_length) {
6 int i;
7 int max_value = 0;
8 for (i = 0; i < list_length; i++) {
9 if (list[i] > max_value)
10 max_value = list[i];
11 }
12 return max_value;
13 }
14
15 void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) {
16
17 int i;
18
19 /* Datenstruktur "erzeugen" */
20 *sec = malloc(sizeof(struct _crit_sec));
21
22 /* Datenstruktur mit "0" initialisieren */
23 for (i = 0; i < MAX_THREADS; i++) {
24 (*sec)->choosing[i] = 0;
25 (*sec)->number[i] = 0;
26 }
27
28 }
29
30 void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) {
31
32 /* Datenstruktur freigeben */
33 free(sec);
34
35 }
36
37 void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {
38
39 int j;
40
41 /* Beginn der Ticket-ID Berechnung */
42 sec->choosing[ThId] = 1;
43
44 /* Neue Ticket-ID berechnen */
45 sec->number[ThId] = maxValueInList(sec->number, MAX_THREADS) + 1;
46
47 /* Ende der Ticket-ID Berechnung */
48 sec->choosing[ThId] = 0;
49
50 /* Alle Threads durchlaufen */
51 for (j = 0; j < MAX_THREADS; j++) {
52
53 /* warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */
54 while (sec->choosing[j] == 1);
55
56 while ( (sec->number[j] != 0) &&
57 (
58 (sec->number[j] < sec->number[ThId]) ||
59 ((sec->number[j] == sec->number[ThId]) && j < ThId)
60 )
61 );
62
63 }
64
65 }
66
67 void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {
68 sec->number[ThId] = 0;
69 }

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed