Pthread fix to let the _S thread yield
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Apr 2010 20:55:55 +0000 (13:55 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:43 +0000 (17:35 -0700)
Documentation/processes.txt
tests/mhello.c
user/parlib/pthread.c

index cd7baf9..42f620a 100644 (file)
@@ -182,13 +182,13 @@ also a syscall to get the vcoreid, but this will save an extra trap at vcore
 start time.
 
 Future proc_runs(), like from RUNNABLE_M to RUNNING_M start all cores at the
-entry point, including vcore0.  The saving of a _S context to vcore0's notif_tf only happens on
-the transition from _S to _M (which the process needs to be aware of for a
-variety of reasons).  This also means that userspace needs to handle vcore0
-coming up at the entry point again (and not starting the program over).  This is
-currently done in sysdeps-ros/start.c, via the static variable init.  Note there
-are some tricky things involving dynamically linked programs, but it all works
-currently.
+entry point, including vcore0.  The saving of a _S context to vcore0's notif_tf
+only happens on the transition from _S to _M (which the process needs to be
+aware of for a variety of reasons).  This also means that userspace needs to
+handle vcore0 coming up at the entry point again (and not starting the program
+over).  This is currently done in sysdeps-ros/start.c, via the static variable
+init.  Note there are some tricky things involving dynamically linked programs,
+but it all works currently.
 
 When coming in to the entry point, whether as the result of a startcore or a
 notification, the kernel will set the stack pointer to whatever is requested
index 721347a..2c628b0 100644 (file)
@@ -133,8 +133,8 @@ void vcore_entry(void)
                        udelay(5000000);
                } */
                printf("restarting vcore0 from userspace\n");
-               /* Do one last check for notifs before clearing pending */
                vcpd->notif_pending = 0;
+               /* Do one last check for notifs after clearing pending */
                /* // testing for missing a notif
                if (first_time) {
                        first_time = FALSE;
index 1f9d9cb..b7781ed 100644 (file)
@@ -46,6 +46,11 @@ void _pthread_init()
        pthread_t t = (pthread_t)calloc(sizeof(struct pthread_tcb), 1);
        t->id = get_next_pid();
        assert(t->id == 0);
+       /* Put the new pthread on the active queue */
+       mcs_lock_lock(&queue_lock);
+       threads_active++;
+       TAILQ_INSERT_TAIL(&active_queue, t, next);
+       mcs_lock_unlock(&queue_lock);
        
        /* Save a pointer to the newly created threads tls region into its tcb */
        t->tls_desc = get_tls_desc(0);
@@ -86,9 +91,10 @@ void __attribute__((noreturn)) vcore_entry()
        // TODO: consider making this restart path work for restarting as well as
        // freshly starting
        if (current_thread) {
-               /* Do one last check for notifs before clearing pending */
-               // TODO: call the handle_notif() here (first)
                vcpd->notif_pending = 0;
+               /* Do one last check for notifs after clearing pending */
+               // TODO: call the handle_notif() here (first)
+
                set_tls_desc(current_thread->tls_desc, vcoreid);
                /* Pop the user trap frame */
                pop_ros_tf(&vcpd->notif_tf, vcoreid);
@@ -113,9 +119,9 @@ void __attribute__((noreturn)) vcore_entry()
        current_thread = new_thread;
        printd("[P] Vcore %d is starting pthread %d\n", vcoreid, new_thread->id);
 
-       /* Do one last check for notifs before clearing pending */
-       // TODO: call the handle_notif() here (first)
        vcpd->notif_pending = 0;
+       /* Do one last check for notifs after clearing pending */
+       // TODO: call the handle_notif() here (first)
        set_tls_desc(new_thread->tls_desc, vcoreid);
 
        /* Load silly state (Floating point) too.  For real */