Get rid of weak symbol overriding for sched_ops
authorKevin Klues <klueska@cs.berkeley.edu>
Thu, 25 Jun 2015 22:26:50 +0000 (15:26 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 25 Jun 2015 22:55:37 +0000 (15:55 -0700)
We now dynamically override these variables inside of our 2LS lib_init
function.  This applies similarly to our signal_ops struct as well.

tests/mcp_halt.c
tests/mhello.c
user/parlib/signal.c
user/parlib/uthread.c
user/pthread/pthread.c

index 809f5af..f994f60 100644 (file)
@@ -18,7 +18,6 @@ void ghetto_vcore_entry(void);
 struct schedule_ops ghetto_sched_ops = {
        .sched_entry = ghetto_vcore_entry,
 };
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
 /* All MCP syscalls will spin instead of blocking */
 static void __ros_syscall_spinon(struct syscall *sysc)
@@ -37,6 +36,9 @@ int main(int argc, char** argv)
        else
                nr_vcores = atoi(argv[1]);
 
+       /* set up our sched ops. */
+       sched_ops = &ghetto_sched_ops;
+
        /* Inits a thread for us, though we won't use it.  Just a hack to get into
         * _M mode.  Note this requests one vcore for us */
        struct uthread dummy = {0};
index 9cb81dc..e58c5ed 100644 (file)
@@ -27,7 +27,6 @@ void ghetto_vcore_entry(void);
 struct schedule_ops ghetto_sched_ops = {
        .sched_entry = ghetto_vcore_entry,
 };
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
 /* Extreme ghetto */
 static void __ros_syscall_spinon(struct syscall *sysc)
@@ -42,6 +41,10 @@ int main(int argc, char** argv)
        uint32_t vcoreid;
        int retval;
 
+       /* set up our sched ops. */
+       sched_ops = &ghetto_sched_ops;
+
+       /* Initialize our barrier. */
        mcs_barrier_init(&b, max_vcores());
 
        /* vcore_context test */
index cca819d..5f4f318 100644 (file)
@@ -48,7 +48,7 @@ static int __sigprocmask(int __how, __const sigset_t *__restrict __set,
 struct signal_ops default_signal_ops = {
        .sigprocmask = __sigprocmask,
 };
-struct signal_ops *signal_ops __attribute__((weak)) = &default_signal_ops;
+struct signal_ops *signal_ops = &default_signal_ops;
 
 /* This is a wait-free-list used to hold the data necessary to execute signal
  * handlers inside a 2LS. We are able to store them in a wfl because all
index 5706833..0005802 100644 (file)
@@ -6,10 +6,11 @@
 #include <parlib/event.h>
 #include <stdlib.h>
 
-/* Which operations we'll call for the 2LS.  Will change a bit with Lithe.  For
- * now, there are no defaults.  2LSs can override sched_ops. */
+/* By default there is no 2LS, but we still want sched_ops set so we can check
+ * its individual function pointers. A 2LS should override sched_ops in its
+ * init code. */
 struct schedule_ops default_2ls_ops = {0};
-struct schedule_ops *sched_ops __attribute__((weak)) = &default_2ls_ops;
+struct schedule_ops *sched_ops = &default_2ls_ops;
 
 __thread struct uthread *current_uthread = 0;
 /* ev_q for all preempt messages (handled here to keep 2LSs from worrying
index ce18328..0a9c181 100644 (file)
@@ -71,10 +71,6 @@ struct signal_ops pthread_signal_ops = {
        .sigprocmask = pthread_sigmask,
 };
 
-/* Publish our sched_ops and signal_ops, overriding the weak defaults */
-struct schedule_ops *sched_ops = &pthread_sched_ops;
-struct signal_ops *signal_ops = &pthread_signal_ops;
-
 /* Static helpers */
 static void __pthread_free_stack(struct pthread_tcb *pt);
 static int __pthread_allocate_stack(struct pthread_tcb *pt);
@@ -598,6 +594,11 @@ void pthread_lib_init(void)
        uintptr_t mmap_block;
        struct pthread_tcb *t;
        int ret;
+
+       /* Publish our sched_ops and signal_ops, overriding the defaults */
+       sched_ops = &pthread_sched_ops;
+       signal_ops = &pthread_signal_ops;
+
        /* Some testing code might call this more than once (once for a slimmed down
         * pth 2LS, and another from pthread_create().  Also, this is racy, but the
         * first time through we are an SCP. */