uth: Track thread0 in uthread.c
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 13 Jul 2015 18:08:31 +0000 (14:08 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jul 2015 20:07:52 +0000 (16:07 -0400)
Needed to have SCPs with no 2LS block uthreads on syscalls properly.
The code prior to this always assumes that current_uthread is set, and
it is thread0.  It'll be easier to reuse parts of uthread for
non-full-2LS SCPs if we can clear current_uthread on occasion.  Still,
in these cases we only have one uthread: thread0.

user/parlib/thread0_sched.c
user/parlib/uthread.c

index f7294ec..f5c838d 100644 (file)
@@ -22,9 +22,14 @@ struct schedule_ops thread0_2ls_ops = {
        .sched_entry = thread0_sched_entry,
 };
 
+/* externed into uthread.c */
+struct uthread *thread0_uth;
+
 /* Thread0 scheduler ops (for processes that haven't linked in a full 2LS) */
 static void thread0_sched_entry(void)
 {
        if (current_uthread)
                run_current_uthread();
+       else
+               run_uthread(thread0_uth);
 }
index 01e616b..be6f896 100644 (file)
@@ -170,18 +170,19 @@ static char *__ros_errstr_loc(void)
  * vcore/2LS/uthread init. */
 void __attribute__((constructor)) uthread_lib_init(void)
 {
-       struct uthread *uthread;
+       /* Use the thread0 sched's uth */
+       extern struct uthread *thread0_uth;
        int ret;
 
        /* Only run once, but make sure that vcore_lib_init() has run already. */
        init_once_racy(return);
        vcore_lib_init();
 
-       ret = posix_memalign((void**)&uthread, __alignof__(struct uthread),
-                                sizeof(struct uthread));
+       ret = posix_memalign((void**)&thread0_uth, __alignof__(struct uthread),
+                            sizeof(struct uthread));
        assert(!ret);
-       memset(uthread, 0, sizeof(struct uthread));     /* aggressively 0 for bugs */
-       uthread_manage_thread0(uthread);
+       memset(thread0_uth, 0, sizeof(struct uthread)); /* aggressively 0 for bugs*/
+       uthread_manage_thread0(thread0_uth);
        scp_vcctx_ready();
        init_posix_signals();
        /* change our blockon from glibc's internal one to the mcp one (which can