/[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.3 by joko, Fri May 26 11:29:41 2006 UTC revision 1.4 by joko, Sun May 28 02:40:05 2006 UTC
# Line 2  Line 2 
2  #include <stdlib.h>  #include <stdlib.h>
3  #include "bakery.h"  #include "bakery.h"
4    
5    /* Hilfsfunktion, um höchsten Wert (integer) in einem Array zu bestimmen */
6  int maxValueInList(int list[], int list_length) {  int maxValueInList(int list[], int list_length) {
7      int i;      int i;
8      int max_value = 0;      int max_value = 0;
# Line 12  int maxValueInList(int list[], int list_ Line 13  int maxValueInList(int list[], int list_
13      return max_value;      return max_value;
14  }  }
15    
16    /* Initialisiert Struktur zur Verwaltung kritischer Abschnitte */
17  void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) {  void My_InitializeCriticalSection( MY_LPCRITICAL_SECTION * sec ) {
18            
19      int i;      int i;
# Line 19  void My_InitializeCriticalSection( MY_LP Line 21  void My_InitializeCriticalSection( MY_LP
21      /* Datenstruktur "erzeugen" */      /* Datenstruktur "erzeugen" */
22      *sec = malloc(sizeof(struct _crit_sec));      *sec = malloc(sizeof(struct _crit_sec));
23            
24      /* Datenstruktur mit "0" initialisieren */      /* Felder der Datenstruktur mit "0" initialisieren */
25      for (i = 0; i < MAX_THREADS; i++) {      for (i = 0; i < MAX_THREADS; i++) {
26          (*sec)->choosing[i] = 0;          (*sec)->choosing[i] = 0;
27          (*sec)->number[i] = 0;          (*sec)->number[i] = 0;
# Line 27  void My_InitializeCriticalSection( MY_LP Line 29  void My_InitializeCriticalSection( MY_LP
29            
30  }  }
31    
32    /* Gibt Speicher zur Verwaltung kritischer Abschnitte wieder frei */
33  void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) {  void My_DeleteCriticalSection( MY_LPCRITICAL_SECTION sec ) {
34            
35      /* Datenstruktur freigeben */      /* Datenstruktur freigeben */
# Line 34  void My_DeleteCriticalSection( MY_LPCRIT Line 37  void My_DeleteCriticalSection( MY_LPCRIT
37            
38  }  }
39    
40    /* Eintritt in kritischen Abschnitt */
41  void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {  void My_EnterCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {
42            
43      int j;      int j;
# Line 41  void My_EnterCriticalSection( int ThId, Line 45  void My_EnterCriticalSection( int ThId,
45      /* Beginn der Ticket-ID Berechnung */      /* Beginn der Ticket-ID Berechnung */
46      sec->choosing[ThId] = 1;      sec->choosing[ThId] = 1;
47            
48      /* Neue Ticket-ID berechnen */      /* Neue Ticket-ID berechnen und zuweisen */
49      sec->number[ThId] = maxValueInList(sec->number, MAX_THREADS) + 1;      sec->number[ThId] = maxValueInList(sec->number, MAX_THREADS) + 1;
50    
51      /* Ende der Ticket-ID Berechnung */      /* Ende der Ticket-ID Berechnung */
# Line 50  void My_EnterCriticalSection( int ThId, Line 54  void My_EnterCriticalSection( int ThId,
54      /* Alle Threads durchlaufen */      /* Alle Threads durchlaufen */
55      for (j = 0; j < MAX_THREADS; j++) {      for (j = 0; j < MAX_THREADS; j++) {
56                    
57          /* warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */          /* Warten, falls ein anderer Thread momentan eine Ticket-ID berechnet (busy wait) */
58          while (sec->choosing[j] == 1);          while (sec->choosing[j] == 1);
59                            
60            /* Bakery Algorithmus: Warten, bis man an der Reihe ist (busy wait) */
61          while ( (sec->number[j] != 0) &&          while ( (sec->number[j] != 0) &&
62                      (                      (
63                          (sec->number[j] < sec->number[ThId]) ||                          (sec->number[j] < sec->number[ThId]) ||
# Line 64  void My_EnterCriticalSection( int ThId, Line 69  void My_EnterCriticalSection( int ThId,
69            
70  }  }
71    
72    /* Austritt aus kritischem Abschnitt */
73  void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {  void My_LeaveCriticalSection( int ThId, MY_LPCRITICAL_SECTION sec ) {
74        
75        /* Ticket löschen */
76      sec->number[ThId] = 0;      sec->number[ThId] = 0;
77      
78  }  }

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

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