Allows pthread_yield() before lib_init()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 14 May 2015 16:29:58 +0000 (12:29 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 May 2015 01:35:44 +0000 (21:35 -0400)
If we call uthread_yield, we'll eventually pop up in vcore context
expecting to run the 2LS.  We need to initialize pthreads (and uthreads)
before that happens.

One option here was to do a run_once on pthread_lib_init for the yield
entry point, but we don't need to become an MCP just because someone
wanted to briefly yield the processor.  sched_yield() is a better fit.

user/pthread/pthread.c

index 320061e..347cffd 100644 (file)
@@ -858,6 +858,12 @@ static void __pth_yield_cb(struct uthread *uthread, void *junk)
 /* Cooperative yielding of the processor, to allow other threads to run */
 int pthread_yield(void)
 {
+       if (!in_multi_mode()) {
+               /* Some apps will call pthread_yield before becoming an MCP.  In these
+                * cases, we just want to yield the processor. */
+               sched_yield();
+               return 0;
+       }
        uthread_yield(TRUE, __pth_yield_cb, 0);
        return 0;
 }