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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by joko, Fri May 26 10:50:19 2006 UTC revision 1.3 by joko, Fri May 26 11:29:41 2006 UTC
# Line 0  Line 1 
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    }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.3

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