diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-13 16:16:29 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-13 17:44:40 +0100 |
commit | 7f1836cfe611e386e7fd47c9451e82d0ea709002 (patch) | |
tree | 00ba1a289930f825ed5bf6a2a5b0a3bc0164b216 | |
parent | if_smc: Add Nexus device support (diff) | |
download | rtems-libbsd-7f1836cfe611e386e7fd47c9451e82d0ea709002.tar.bz2 |
TIMEOUT(9): Start callout timer later
This avoid race conditions during initialization.
-rw-r--r-- | freebsd/sys/kern/kern_timeout.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/freebsd/sys/kern/kern_timeout.c b/freebsd/sys/kern/kern_timeout.c index 4ef7909f..1ca98d9e 100644 --- a/freebsd/sys/kern/kern_timeout.c +++ b/freebsd/sys/kern/kern_timeout.c @@ -216,7 +216,9 @@ cc_cme_migrating(struct callout_cpu *cc) * and may be called more then once. */ #ifdef __rtems__ -static void rtems_bsd_timeout_init(void *); +static void rtems_bsd_timeout_init_early(void *); + +static void callout_cpu_init(struct callout_cpu *); static void rtems_bsd_callout_timer(rtems_id id, void *arg) @@ -231,13 +233,29 @@ rtems_bsd_callout_timer(rtems_id id, void *arg) callout_tick(); } -static void callout_cpu_init(struct callout_cpu *); +static void +rtems_bsd_timeout_init_late(void *unused) +{ + rtems_status_code sc; + rtems_id id; -SYSINIT(rtems_bsd_timeout, SI_SUB_VM, SI_ORDER_FIRST, rtems_bsd_timeout_init, - NULL); + (void) unused; + + sc = rtems_timer_create(rtems_build_name('_', 'C', 'L', 'O'), &id); + BSD_ASSERT(sc == RTEMS_SUCCESSFUL); + + sc = rtems_timer_server_fire_after(id, 1, rtems_bsd_callout_timer, NULL); + BSD_ASSERT(sc == RTEMS_SUCCESSFUL); +} + +SYSINIT(rtems_bsd_timeout_early, SI_SUB_VM, SI_ORDER_FIRST, + rtems_bsd_timeout_init_early, NULL); + +SYSINIT(rtems_bsd_timeout_late, SI_SUB_RUN_SCHEDULER, SI_ORDER_FIRST, + rtems_bsd_timeout_init_late, NULL); static void -rtems_bsd_timeout_init(void *unused) +rtems_bsd_timeout_init_early(void *unused) #else /* __rtems__ */ caddr_t kern_timeout_callwheel_alloc(caddr_t v) @@ -245,8 +263,6 @@ kern_timeout_callwheel_alloc(caddr_t v) { struct callout_cpu *cc; #ifdef __rtems__ - rtems_status_code sc; - rtems_id id; caddr_t v; (void) unused; @@ -275,12 +291,6 @@ kern_timeout_callwheel_alloc(caddr_t v) return(v); #else /* __rtems__ */ callout_cpu_init(cc); - - sc = rtems_timer_create(rtems_build_name('_', 'C', 'L', 'O'), &id); - BSD_ASSERT(sc == RTEMS_SUCCESSFUL); - - sc = rtems_timer_server_fire_after(id, 1, rtems_bsd_callout_timer, NULL); - BSD_ASSERT(sc == RTEMS_SUCCESSFUL); #endif /* __rtems__ */ } |