Fixes bug with semaphores and futexes
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 21 Dec 2012 04:15:28 +0000 (20:15 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 21 Dec 2012 04:15:28 +0000 (20:15 -0800)
All code using the pthread 2LS that calls uthread_yield() needs to call
the pthread generic yield helper.  It was static, but since we have sync
methods in other files (sem/futex), we should have it available.

omp_hello was getting corrupt lists, since simply putting it on the
sem's queue without first removing it from the active list ends up with
the threads being on multiple lists.  Once again, the active list keeps
us honest.

user/pthread/futex.c
user/pthread/pthread.c
user/pthread/pthread.h
user/pthread/semaphore.c

index 16375a9..e4d896c 100644 (file)
@@ -34,6 +34,7 @@ static inline void futex_init()
 static void __futex_block(struct uthread *uthread, void *arg) {
   struct futex_element *e = (struct futex_element*)arg;
   e->pthread = (pthread_t)uthread;
+       __pthread_generic_yield(e->pthread);
   e->pthread->state = PTH_BLK_MUTEX;
   TAILQ_INSERT_TAIL(&__futex.queue, e, link);
   mcs_pdr_unlock(&__futex.lock);
index 771e133..f3c8d58 100644 (file)
@@ -442,8 +442,8 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
 
 /* Helper that all pthread-controlled yield paths call.  Just does some
  * accounting.  This is another example of how the much-loathed (and loved)
- * active queue is keeping us honest. */
-static void __pthread_generic_yield(struct pthread_tcb *pthread)
+ * active queue is keeping us honest.  Need to export for sem and friends. */
+void __pthread_generic_yield(struct pthread_tcb *pthread)
 {
        mcs_pdr_lock(&queue_lock);
        threads_active--;
index 73b4462..b0c835c 100644 (file)
@@ -128,6 +128,7 @@ typedef dtls_key_t pthread_key_t;
 /* Akaros pthread extensions / hacks */
 void pthread_can_vcore_request(bool can);      /* default is TRUE */
 void pthread_lib_init(void);
+void __pthread_generic_yield(struct pthread_tcb *pthread);
 
 /* The pthreads API */
 int pthread_attr_init(pthread_attr_t *);
index 54692e0..5b8751c 100644 (file)
@@ -38,9 +38,11 @@ int sem_unlink (__const char *__name)
        return -1;
 }
 
-static void __sem_block(struct uthread *uthread, void *arg) {
+static void __sem_block(struct uthread *uthread, void *arg)
+{
        sem_t *__sem = (sem_t*)arg;
        pthread_t pthread = (pthread_t)uthread;
+       __pthread_generic_yield(pthread);
        pthread->state = PTH_BLK_MUTEX;
        TAILQ_INSERT_TAIL(&__sem->queue, pthread, next);
        mcs_pdr_unlock(&__sem->lock);