Fixed deadlock issue in pthread barrier wait.
authorDavid Zhu <yuzhu@cs.berkeley.edu>
Wed, 28 Apr 2010 02:57:55 +0000 (19:57 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:45 +0000 (17:35 -0700)
While a thread is waiting on a barrier, it can call pthread_yield and may come
back on a different vcore. Using vcore id as the index into the sense array
is wrong. Use pthread id instead.

In the future, we might dynamically allocate the sense array based on how
many pthreads will wait on a barrier, instead of having the static array.

user/include/pthread.h
user/parlib/pthread.c

index 78c3d33..6a4015d 100644 (file)
@@ -62,9 +62,11 @@ typedef struct
   int lock;
 } pthread_mutex_t;
 
+//TODO: MAX_PTHREADS is arbitrarily defined for now.
+#define MAX_PTHREADS 128
 typedef struct
 {
-  int local_sense[32*MAX_VCORES];
+  int local_sense[32*MAX_PTHREADS];
   volatile int sense;
   int count;
   int nprocs;
index a9f44bf..ef390f1 100644 (file)
@@ -569,7 +569,9 @@ int pthread_barrier_init(pthread_barrier_t* b, const pthread_barrierattr_t* a, i
 int pthread_barrier_wait(pthread_barrier_t* b)
 {
   unsigned int spinner = 0;
-  int id = vcore_id();
+  struct pthread_tcb *t = pthread_self();
+
+  int id = t->id;
   int ls = b->local_sense[32*id] = 1 - b->local_sense[32*id];
 
   pthread_mutex_lock(&b->pmutex);