parlib: Prevent running ctors twice
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Aug 2017 18:21:23 +0000 (14:21 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Aug 2017 20:14:49 +0000 (16:14 -0400)
Previously, we only were protecting vcore_lib_init() and
uthread_lib_init().  However, there are other ctors out there, some of
which have external effects (devalarm).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/alarm.c
user/parlib/panic.c
user/parlib/vcore_tick.c

index 00d7eea..54eaad4 100644 (file)
@@ -153,6 +153,8 @@ static void __attribute__((constructor)) init_alarm_service(void)
        struct event_queue *ev_q;
        static struct fork_cb devalarm_fork_cb = {.func = devalarm_forked};
 
+       if (__in_fake_parlib())
+               return;
        /* Sets up timer chain (only one chain per process) */
        spin_pdr_init(&global_tchain.lock);
        TAILQ_INIT(&global_tchain.waiters);
index ecac76c..dc796f5 100644 (file)
@@ -7,6 +7,8 @@
 
 static void __attribute__((constructor)) parlib_stdio_init(void)
 {
+       if (__in_fake_parlib())
+               return;
        /* This isn't ideal, since it might affect some stdout streams where our
         * parent tried to do something else.  Note that isatty() always returns
         * TRUE, due to how we fake tcgetattr(), and that doesn't affect whatever
index d19ab95..fcd9e1d 100644 (file)
@@ -35,6 +35,8 @@ static struct vcore_tick *__vc_ticks;
 
 static void __attribute__((constructor)) vcore_tick_lib_init(void)
 {
+       if (__in_fake_parlib())
+               return;
        __vc_ticks = calloc(max_vcores(), sizeof(struct vcore_tick));
        assert(__vc_ticks);
 }