From 4d4ba58fca7753c1bbe56d43e7977f2a9601e772 Mon Sep 17 00:00:00 2001 From: "Bjoern B. Brandenburg" Date: Thu, 28 Jul 2011 01:16:04 -0400 Subject: Switch to new np-section protocol. Everything is in one 32-bit word now. --- include/internal.h | 5 +++++ include/litmus.h | 1 + src/kernel_iface.c | 15 ++++++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/internal.h b/include/internal.h index 07253b7..f30ce61 100644 --- a/include/internal.h +++ b/include/internal.h @@ -18,8 +18,13 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, } +/* taken from the kernel */ + #define likely(x) __builtin_expect((x), 1) #define unlikely(x) __builtin_expect((x), 0) +#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) +#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) + #endif diff --git a/include/litmus.h b/include/litmus.h index 40ee124..4c85d28 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -96,6 +96,7 @@ task_class_t str2class(const char* str); /* non-preemptive section support */ void enter_np(void); void exit_np(void); +int requested_to_preempt(void); /* task system support */ int wait_for_ts_release(void); diff --git a/src/kernel_iface.c b/src/kernel_iface.c index 1426795..33d56df 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -43,6 +43,8 @@ int init_kernel_iface(void) int err = 0; long page_size = sysconf(_SC_PAGESIZE); + BUILD_BUG_ON(sizeof(union np_flag) != sizeof(uint32_t)); + err = map_file(LITMUS_CTRL_DEVICE, (void**) &ctrl_page, CTRL_PAGES * page_size); if (err) { fprintf(stderr, "%s: cannot open LITMUS^RT control page (%m)\n", @@ -55,7 +57,7 @@ int init_kernel_iface(void) void enter_np(void) { if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) - ctrl_page->np_flag++; + ctrl_page->sched.np.flag++; else fprintf(stderr, "enter_np: control page not mapped!\n"); } @@ -63,14 +65,21 @@ void enter_np(void) void exit_np(void) { - if (likely(ctrl_page != NULL) && --ctrl_page->np_flag == 0) { + if (likely(ctrl_page != NULL) && + ctrl_page->sched.np.flag && + !(--ctrl_page->sched.np.flag)) { /* became preemptive, let's check for delayed preemptions */ __sync_synchronize(); - if (ctrl_page->delayed_preemption) + if (ctrl_page->sched.np.preempt) sched_yield(); } } +int requested_to_preempt(void) +{ + return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); +} + /* init and return a ptr to the control page for * preemption and migration overhead analysis * -- cgit v1.2.2