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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide 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 joko 1.2
2     #include <stdlib.h>
3     #include "bakery.h"
4    
5 joko 1.3 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 joko 1.2 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 joko 1.3
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