Vcore helper for enable/disable notifications
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Feb 2011 22:41:23 +0000 (14:41 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:58 +0000 (17:35 -0700)
tests/mhello.c
tests/syscall.c
user/parlib/include/vcore.h
user/pthread/pthread.c

index 7d59bba..eefb5b1 100644 (file)
@@ -52,9 +52,7 @@ int main(int argc, char** argv)
         * user_thread_tcb so it can be restarted too */
 
        /* don't forget to enable notifs on vcore0 at some point */
-       struct preempt_data *vcpd;
-       vcpd = &__procdata.vcore_preempt_data[0];
-       vcpd->notif_enabled = TRUE;
+       enable_notifs(0);
        
 /* end: stuff userspace needs to do before switching to multi-mode */
 
@@ -173,7 +171,7 @@ void vcore_entry(void)
         * to clobber the transition stack.
         * Check Documentation/processes.txt: 4.2.4.  In real code, you should be
         * popping the tf of whatever user process you want (get off the x-stack) */
-       vcpd->notif_enabled = TRUE;
+       enable_notifs(vcoreid);
        
 /* end: stuff userspace needs to do to handle notifications */
 
index 4c88f7c..9c312bd 100644 (file)
@@ -51,10 +51,7 @@ int main(int argc, char** argv)
        core0_tls = get_tls_desc(0);
        /* Need to save our floating point state somewhere (like in the
         * user_thread_tcb so it can be restarted too */
-       /* don't forget to enable notifs on vcore0 at some point */
-       struct preempt_data *vcpd;
-       vcpd = &__procdata.vcore_preempt_data[0];
-       vcpd->notif_enabled = TRUE;
+       enable_notifs(0);
 /* end: stuff userspace needs to do before switching to multi-mode */
 
        retval = vcore_request(1);
index 7027e4f..78cae58 100644 (file)
@@ -40,6 +40,16 @@ void vcore_yield(void);
 size_t max_vcores(void);
 size_t num_vcores(void);
 
+static inline void enable_notifs(uint32_t vcoreid)
+{
+       __procdata.vcore_preempt_data[vcoreid].notif_enabled = TRUE;
+}
+
+static inline void disable_notifs(uint32_t vcoreid)
+{
+       __procdata.vcore_preempt_data[vcoreid].notif_enabled = FALSE;
+}
+
 #ifdef __cplusplus
 }
 #endif
index 8b58f16..4a99248 100644 (file)
@@ -46,8 +46,7 @@ void _pthread_init()
 
        /* don't forget to enable notifs on vcore0.  if you don't, the kernel will
         * restart your _S with notifs disabled, which is a path to confusion. */
-       struct preempt_data *vcpd = &__procdata.vcore_preempt_data[0];
-       vcpd->notif_enabled = TRUE;
+       enable_notifs(0);
 
        /* Create a pthread_tcb for the main thread */
        pthread_t t = (pthread_t)calloc(1, sizeof(struct pthread_tcb));
@@ -325,7 +324,7 @@ int pthread_yield(void)
        /* once we do this, we might miss a notif_pending, so we need to enter vcore
         * entry later.  Need to disable notifs so we don't get in weird loops with
         * save_ros_tf() and pop_ros_tf(). */
-       vcpd->notif_enabled = FALSE;
+       disable_notifs(vcoreid);
        /* take the current state and save it into t->utf when this pthread
         * restarts, it will continue from right after this, see yielding is false,
         * and short ciruit the function. */
@@ -563,7 +562,7 @@ void pthread_exit(void* ret)
        
        /* once we do this, we might miss a notif_pending, so we need to enter vcore
         * entry later. */
-       vcpd->notif_enabled = FALSE;
+       disable_notifs(vcoreid);
 
        /* Change to the transition context (both TLS and stack). */
        extern void** vcore_thread_control_blocks;