From f215a05c0ea23c7779b1a3a4361b4d88ddc73dc1 Mon Sep 17 00:00:00 2001 From: Bjoern Brandenburg Date: Tue, 14 Aug 2012 20:29:17 +0200 Subject: Implement get_nr_ts_release_waiters() /proc wrapper Add a wrapper for /proc/litmus/stats to make it easy to query the number of tasks already waiting for a task set release. --- bin/release_ts.c | 20 +------------------- include/internal.h | 3 +++ include/litmus.h | 1 + src/kernel_iface.c | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/bin/release_ts.c b/bin/release_ts.c index 9740df2..7752097 100644 --- a/bin/release_ts.c +++ b/bin/release_ts.c @@ -7,6 +7,7 @@ #include #include "litmus.h" +#include "internal.h" #define OPTSTR "d:wf:" #define NS_PER_MS 1000000 @@ -27,25 +28,6 @@ void usage(char *error) { exit(1); } -ssize_t read_file(const char* fname, void* buf, size_t maxlen) -{ - int fd; - ssize_t n = 0; - size_t got = 0; - - fd = open(fname, O_RDONLY); - if (fd == -1) - return -1; - - while (got < maxlen && (n = read(fd, buf + got, maxlen - got)) > 0) - got += n; - close(fd); - if (n < 0) - return -1; - else - return got; -} - void wait_until_ready(int expected) { int ready = 0, all = 0; diff --git a/include/internal.h b/include/internal.h index f30ce61..747f095 100644 --- a/include/internal.h +++ b/include/internal.h @@ -26,5 +26,8 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) #define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) +/* I/O convenience function */ +ssize_t read_file(const char* fname, void* buf, size_t maxlen); + #endif diff --git a/include/litmus.h b/include/litmus.h index 82e4bd1..e4b619e 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -120,6 +120,7 @@ int requested_to_preempt(void); /* task system support */ int wait_for_ts_release(void); int release_ts(lt_t *delay); +int get_nr_ts_release_waiters(void); #define __NS_PER_MS 1000000 diff --git a/src/kernel_iface.c b/src/kernel_iface.c index 33d56df..b9c8f59 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -12,6 +12,8 @@ #define LITMUS_CTRL_DEVICE "/dev/litmus/ctrl" #define CTRL_PAGES 1 +#define LITMUS_STATS_FILE "/proc/litmus/stats" + static int map_file(const char* filename, void **addr, size_t size) { int error = 0; @@ -35,6 +37,43 @@ static int map_file(const char* filename, void **addr, size_t size) return error; } +ssize_t read_file(const char* fname, void* buf, size_t maxlen) +{ + int fd; + ssize_t n = 0; + size_t got = 0; + + fd = open(fname, O_RDONLY); + if (fd == -1) + return -1; + + while (got < maxlen && (n = read(fd, buf + got, maxlen - got)) > 0) + got += n; + close(fd); + if (n < 0) + return -1; + else + return got; +} + +int get_nr_ts_release_waiters(void) +{ + int ready = 0, all = 0; + char buf[100]; + ssize_t len; + + len = read_file(LITMUS_STATS_FILE, buf, sizeof(buf) - 1); + if (len >= 0) + len = sscanf(buf, + "real-time tasks = %d\n" + "ready for release = %d\n", + &all, &ready); + if (len == 2) + return ready; + else + return len; +} + /* thread-local pointer to control page */ static __thread struct control_page *ctrl_page; -- cgit v1.2.2