uthread_vcore_entry() can handle not having a 2LS
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Mar 2012 00:38:34 +0000 (17:38 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Mar 2012 00:43:07 +0000 (17:43 -0700)
_Ss that never link in a 2LS will pop up in vcore_entry() when receiving
events.  This patch allows them to restart current_uthread - sort of a
'default 2LS op'.  I thought of making it an actual member of
default_2ls_ops, but I didn't want 2LS writers to think it is actually a
real default choice for them.  It's just to make _S code work.

user/parlib/uthread.c

index 3513100..7c2da23 100644 (file)
@@ -123,9 +123,16 @@ void __attribute__((noreturn)) uthread_vcore_entry(void)
        handle_events(vcoreid);
        __check_preempt_pending(vcoreid);
        assert(in_vcore_context());     /* double check, in case an event changed it */
-       assert(sched_ops->sched_entry);
-       sched_ops->sched_entry();
+       /* Consider using the default_2ls_op for this, though it's a bit weird. */
+       if (sched_ops->sched_entry) {
+               sched_ops->sched_entry();
+       } else if (current_uthread) {
+               run_current_uthread();
+       }
        /* 2LS sched_entry should never return */
+       /* Either the 2LS sched_entry returned, run_cur_uth() returned, or we
+        * didn't have a current_uthread.  If we didn't have a 2LS op, we should be
+        * in _S mode and always have a current_uthread. */
        assert(0);
 }