parlib: Use better fake mutexes for thread0
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jan 2017 22:12:30 +0000 (17:12 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jan 2017 22:12:30 +0000 (17:12 -0500)
The thread0 scheduler has only one thread, but we should have at least a
little blob for mutexes so that we can catch problems.  Any code in a
thread0 scheduler that tries to lock the same mutex twice ought to be a
deadlock bug (or VC ctx trying to sleep).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/thread0_sched.c

index 45a47a5..7571a50 100644 (file)
@@ -146,21 +146,37 @@ static void thread0_thread_has_blocked(struct uthread *uth, int flags)
        thread0_info.is_blocked = TRUE;
 }
 
-/* We only have one thread, so we don't need mutexes */
+/* We only have one thread, so we don't *need* mutexes.  But we'll use a bool to
+ * catch code that could deadlock itself. */
 static uth_mutex_t thread0_mtx_alloc(void)
 {
-       /* Returning something non-zero, in case someone compares it to 0 */
-       return (uth_mutex_t)0x1234;
+       bool *mtx = malloc(sizeof(bool));
+
+       assert(mtx);
+       *mtx = FALSE;
+       return (uth_mutex_t)mtx;
 }
 
 static void thread0_mtx_free(uth_mutex_t m)
 {
+       bool *mtx = (bool*)m;
+
+       assert(*mtx == FALSE);
+       free((void*)m);
 }
 
 static void thread0_mtx_lock(uth_mutex_t m)
 {
+       bool *mtx = (bool*)m;
+
+       assert(*mtx == FALSE);
+       *mtx = TRUE;
 }
 
 static void thread0_mtx_unlock(uth_mutex_t m)
 {
+       bool *mtx = (bool*)m;
+
+       assert(*mtx == TRUE);
+       *mtx = FALSE;
 }