fixed pthread_barrier_wait bug
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 11 Nov 2009 04:35:19 +0000 (20:35 -0800)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 11 Nov 2009 04:35:19 +0000 (20:35 -0800)
user/parlib/inc/pthread.h
user/parlib/src/pthread.c

index 59216d8..b0cabf3 100644 (file)
@@ -18,15 +18,6 @@ struct pthread_wqt
 
 typedef struct
 {
-  int* local_sense;
-  volatile int sense;
-  int count;
-  int nprocs;
-  hart_lock_t lock;
-} pthread_barrier_t;
-
-typedef struct
-{
   int type;
 } pthread_mutexattr_t;
 
@@ -38,6 +29,15 @@ typedef struct
 
 typedef struct
 {
+  int local_sense[32*HART_MAX_MAX_HARTS];
+  volatile int sense;
+  int count;
+  int nprocs;
+  hart_lock_t lock;
+} pthread_barrier_t;
+
+typedef struct
+{
   int pshared;
 } pthread_condattr_t;
 
index 75c9db0..40fa669 100644 (file)
@@ -134,7 +134,7 @@ int pthread_mutex_init(pthread_mutex_t* m, const pthread_mutexattr_t* attr)
 int pthread_mutex_lock(pthread_mutex_t* m)
 {
   while(pthread_mutex_trylock(m))
-    while((volatile size_t*)m->lock);
+    while(*(volatile size_t*)&m->lock);
   return 0;
 }
 
@@ -264,8 +264,7 @@ int pthread_once(pthread_once_t* once_control, void (*init_routine)(void))
 
 int pthread_barrier_init(pthread_barrier_t* b, const pthread_barrierattr_t* a, int count)
 {
-  b->local_sense = (int*)malloc(32*sizeof(int)*count);
-  memset(b->local_sense,0,32*sizeof(int)*count);
+  memset(b->local_sense,0,sizeof(b->local_sense));
 
   b->sense = 0;
   b->nprocs = b->count = count;
@@ -297,6 +296,5 @@ int pthread_barrier_wait(pthread_barrier_t* b)
 
 int pthread_barrier_destroy(pthread_barrier_t* b)
 {
-  free(b->local_sense);
   return 0;
 }