summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-13 16:16:29 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-13 17:44:40 +0100
commit7f1836cfe611e386e7fd47c9451e82d0ea709002 (patch)
tree00ba1a289930f825ed5bf6a2a5b0a3bc0164b216
parentif_smc: Add Nexus device support (diff)
downloadrtems-libbsd-7f1836cfe611e386e7fd47c9451e82d0ea709002.tar.bz2
TIMEOUT(9): Start callout timer later
This avoid race conditions during initialization.
-rw-r--r--freebsd/sys/kern/kern_timeout.c36
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__ */
}