[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks
Module: xenomai-forge Branch: rtdm-api-waitqueues Commit: aa44c70383cf68e37cb57c3a05ce4de15fef1974 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=aa44c70383cf68e37cb57c3a05ce4de15fef1974 Author: Philippe Gerum Date: Fri Apr 11 11:47:17 2014 +0200 copperplate/regd: rebase systemfs handlers over fsobstacks This fixes a long-standing bug which caused random duplicate output from the systemfs handlers, due to misusing the fuse read() method. --- include/copperplate/registry-obstack.h |2 ++ lib/copperplate/regd/fs-cobalt.c | 47 +--- lib/copperplate/regd/fs-common.c | 61 ++-- lib/copperplate/regd/fs-mercury.c | 12 +-- lib/copperplate/regd/regd.c|2 +- lib/copperplate/regd/sysregfs.h| 14 +++- 6 files changed, 68 insertions(+), 70 deletions(-) diff --git a/include/copperplate/registry-obstack.h b/include/copperplate/registry-obstack.h index 0fd1e1c..aaafaa5 100644 --- a/include/copperplate/registry-obstack.h +++ b/include/copperplate/registry-obstack.h @@ -32,6 +32,8 @@ #define obstack_chunk_allocpvmalloc #define obstack_chunk_free pvfree +struct threadobj; + struct fsobstack { struct obstack obstack; void *data; diff --git a/lib/copperplate/regd/fs-cobalt.c b/lib/copperplate/regd/fs-cobalt.c index 1260e59..b7c1034 100644 --- a/lib/copperplate/regd/fs-cobalt.c +++ b/lib/copperplate/regd/fs-cobalt.c @@ -88,43 +88,24 @@ char *format_thread_status(const struct thread_data *p, char *buf, size_t len) */ #define PROC_PULL_HANDLER(__name, __path) \ -ssize_t read_ ## __name(struct fsobj *fsobj, char *buf, \ - size_t size, off_t offset, \ - void *priv) \ +int open_ ## __name(struct fsobj *fsobj, void *priv) \ { \ - return pull_proc_data("/proc/xenomai/" __path, buf, size); \ + return pull_proc_data("/proc/xenomai/" __path, priv); \ } /* * Cobalt-specific helper to pull the /proc vfile data provided by the * nucleus over a fuse-managed vfile. */ -static ssize_t pull_proc_data(const char *procpath, char *buf, size_t size) +static int pull_proc_data(const char *path, struct fsobstack *o) { - size_t len = 0; - FILE *fp; - int c; - - if (size == 0) - return 0; - - fp = fopen(procpath, "r"); - if (fp == NULL) - return -errno; - - while (len < size) { - c = fgetc(fp); - if (c == EOF) { - if (ferror(fp)) - len = -errno; - break; - } - buf[len++] = c; - } + int len; - fclose(fp); + fsobstack_init(o); + len = fsobstack_grow_file(o, path); + fsobstack_finish(o); - return (ssize_t)len; + return len < 0 ? len : 0; } PROC_PULL_HANDLER(threads, "/sched/threads"); @@ -143,21 +124,27 @@ struct sysreg_fsfile sysreg_files[] = { .path = "/threads", .mode = O_RDONLY, .ops = { - .read = read_threads, + .open = open_threads, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/heaps", .mode = O_RDONLY, .ops = { - .read = read_heaps, + .open = open_heaps, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/version", .mode = O_RDONLY, .ops = { - .read = read_version, + .open = open_version, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { diff --git a/lib/copperplate/regd/fs-common.c b/lib/copperplate/regd/fs-common.c index b689b44..6346320 100644 --- a/lib/copperplate/regd/fs-common.c +++ b/lib/copperplate/regd/fs-common.c @@ -67,23 +67,23 @@ static char *format_time(ticks_t value, char *buf, size_t bufsz) return buf; } -ssize_t read_threads(struct fsobj *fsobj, char *buf, -size_t size, off_t offset, -void *priv) +int open_threads(struct fsobj *fsobj, void *priv) { struct thread_data *thread_data, *p; char sbuf[64], pbuf[16], tbuf[64]; struct threadobj_stat statbuf; struct sysgroup_memspec *obj; + struct fsobstack *o = priv; struct threadobj *thobj; const char *sch
[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks
Module: xenomai-forge Branch: next Commit: aa44c70383cf68e37cb57c3a05ce4de15fef1974 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=aa44c70383cf68e37cb57c3a05ce4de15fef1974 Author: Philippe Gerum Date: Fri Apr 11 11:47:17 2014 +0200 copperplate/regd: rebase systemfs handlers over fsobstacks This fixes a long-standing bug which caused random duplicate output from the systemfs handlers, due to misusing the fuse read() method. --- include/copperplate/registry-obstack.h |2 ++ lib/copperplate/regd/fs-cobalt.c | 47 +--- lib/copperplate/regd/fs-common.c | 61 ++-- lib/copperplate/regd/fs-mercury.c | 12 +-- lib/copperplate/regd/regd.c|2 +- lib/copperplate/regd/sysregfs.h| 14 +++- 6 files changed, 68 insertions(+), 70 deletions(-) diff --git a/include/copperplate/registry-obstack.h b/include/copperplate/registry-obstack.h index 0fd1e1c..aaafaa5 100644 --- a/include/copperplate/registry-obstack.h +++ b/include/copperplate/registry-obstack.h @@ -32,6 +32,8 @@ #define obstack_chunk_allocpvmalloc #define obstack_chunk_free pvfree +struct threadobj; + struct fsobstack { struct obstack obstack; void *data; diff --git a/lib/copperplate/regd/fs-cobalt.c b/lib/copperplate/regd/fs-cobalt.c index 1260e59..b7c1034 100644 --- a/lib/copperplate/regd/fs-cobalt.c +++ b/lib/copperplate/regd/fs-cobalt.c @@ -88,43 +88,24 @@ char *format_thread_status(const struct thread_data *p, char *buf, size_t len) */ #define PROC_PULL_HANDLER(__name, __path) \ -ssize_t read_ ## __name(struct fsobj *fsobj, char *buf, \ - size_t size, off_t offset, \ - void *priv) \ +int open_ ## __name(struct fsobj *fsobj, void *priv) \ { \ - return pull_proc_data("/proc/xenomai/" __path, buf, size); \ + return pull_proc_data("/proc/xenomai/" __path, priv); \ } /* * Cobalt-specific helper to pull the /proc vfile data provided by the * nucleus over a fuse-managed vfile. */ -static ssize_t pull_proc_data(const char *procpath, char *buf, size_t size) +static int pull_proc_data(const char *path, struct fsobstack *o) { - size_t len = 0; - FILE *fp; - int c; - - if (size == 0) - return 0; - - fp = fopen(procpath, "r"); - if (fp == NULL) - return -errno; - - while (len < size) { - c = fgetc(fp); - if (c == EOF) { - if (ferror(fp)) - len = -errno; - break; - } - buf[len++] = c; - } + int len; - fclose(fp); + fsobstack_init(o); + len = fsobstack_grow_file(o, path); + fsobstack_finish(o); - return (ssize_t)len; + return len < 0 ? len : 0; } PROC_PULL_HANDLER(threads, "/sched/threads"); @@ -143,21 +124,27 @@ struct sysreg_fsfile sysreg_files[] = { .path = "/threads", .mode = O_RDONLY, .ops = { - .read = read_threads, + .open = open_threads, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/heaps", .mode = O_RDONLY, .ops = { - .read = read_heaps, + .open = open_heaps, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/version", .mode = O_RDONLY, .ops = { - .read = read_version, + .open = open_version, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { diff --git a/lib/copperplate/regd/fs-common.c b/lib/copperplate/regd/fs-common.c index b689b44..6346320 100644 --- a/lib/copperplate/regd/fs-common.c +++ b/lib/copperplate/regd/fs-common.c @@ -67,23 +67,23 @@ static char *format_time(ticks_t value, char *buf, size_t bufsz) return buf; } -ssize_t read_threads(struct fsobj *fsobj, char *buf, -size_t size, off_t offset, -void *priv) +int open_threads(struct fsobj *fsobj, void *priv) { struct thread_data *thread_data, *p; char sbuf[64], pbuf[16], tbuf[64]; struct threadobj_stat statbuf; struct sysgroup_memspec *obj; + struct fsobstack *o = priv; struct threadobj *thobj; const char *sched_class; -
[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks
Module: xenomai-forge Branch: next Commit: e540c7dcd5bfbe07435c27dd853496f52f4021eb URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e540c7dcd5bfbe07435c27dd853496f52f4021eb Author: Philippe Gerum Date: Fri Apr 11 11:47:17 2014 +0200 copperplate/regd: rebase systemfs handlers over fsobstacks This fixes a long-standing bug which caused random duplicate output from the systemfs handlers, due to misusing the fuse read() method. --- lib/copperplate/regd/fs-cobalt.c | 47 +++- lib/copperplate/regd/fs-common.c | 61 + lib/copperplate/regd/fs-mercury.c | 12 ++-- lib/copperplate/regd/regd.c |2 +- lib/copperplate/regd/sysregfs.h | 14 +++-- 5 files changed, 66 insertions(+), 70 deletions(-) diff --git a/lib/copperplate/regd/fs-cobalt.c b/lib/copperplate/regd/fs-cobalt.c index 1260e59..b7c1034 100644 --- a/lib/copperplate/regd/fs-cobalt.c +++ b/lib/copperplate/regd/fs-cobalt.c @@ -88,43 +88,24 @@ char *format_thread_status(const struct thread_data *p, char *buf, size_t len) */ #define PROC_PULL_HANDLER(__name, __path) \ -ssize_t read_ ## __name(struct fsobj *fsobj, char *buf, \ - size_t size, off_t offset, \ - void *priv) \ +int open_ ## __name(struct fsobj *fsobj, void *priv) \ { \ - return pull_proc_data("/proc/xenomai/" __path, buf, size); \ + return pull_proc_data("/proc/xenomai/" __path, priv); \ } /* * Cobalt-specific helper to pull the /proc vfile data provided by the * nucleus over a fuse-managed vfile. */ -static ssize_t pull_proc_data(const char *procpath, char *buf, size_t size) +static int pull_proc_data(const char *path, struct fsobstack *o) { - size_t len = 0; - FILE *fp; - int c; - - if (size == 0) - return 0; - - fp = fopen(procpath, "r"); - if (fp == NULL) - return -errno; - - while (len < size) { - c = fgetc(fp); - if (c == EOF) { - if (ferror(fp)) - len = -errno; - break; - } - buf[len++] = c; - } + int len; - fclose(fp); + fsobstack_init(o); + len = fsobstack_grow_file(o, path); + fsobstack_finish(o); - return (ssize_t)len; + return len < 0 ? len : 0; } PROC_PULL_HANDLER(threads, "/sched/threads"); @@ -143,21 +124,27 @@ struct sysreg_fsfile sysreg_files[] = { .path = "/threads", .mode = O_RDONLY, .ops = { - .read = read_threads, + .open = open_threads, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/heaps", .mode = O_RDONLY, .ops = { - .read = read_heaps, + .open = open_heaps, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/version", .mode = O_RDONLY, .ops = { - .read = read_version, + .open = open_version, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { diff --git a/lib/copperplate/regd/fs-common.c b/lib/copperplate/regd/fs-common.c index b689b44..6346320 100644 --- a/lib/copperplate/regd/fs-common.c +++ b/lib/copperplate/regd/fs-common.c @@ -67,23 +67,23 @@ static char *format_time(ticks_t value, char *buf, size_t bufsz) return buf; } -ssize_t read_threads(struct fsobj *fsobj, char *buf, -size_t size, off_t offset, -void *priv) +int open_threads(struct fsobj *fsobj, void *priv) { struct thread_data *thread_data, *p; char sbuf[64], pbuf[16], tbuf[64]; struct threadobj_stat statbuf; struct sysgroup_memspec *obj; + struct fsobstack *o = priv; struct threadobj *thobj; const char *sched_class; - ssize_t len = 0; - int ret, count; + int ret, count, len = 0; ret = heapobj_bind_session(__node_info.session_label); if (ret) return ret; + fsobstack_init(o); + sysgroup_lock(); count = sysgroup_count(thread); sysgroup_unlock(); @@ -132,9 +132,9 @@ ssize_t read_threads(struct fsobj *fsobj, char *buf, if (count == 0) goto out_free; - len = sprintf(buf, "%-3
[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks
Module: xenomai-forge Branch: next Commit: 03f60d0516014f48d960ea7dc9fb72ee9b0ca815 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=03f60d0516014f48d960ea7dc9fb72ee9b0ca815 Author: Philippe Gerum Date: Fri Apr 11 11:47:17 2014 +0200 copperplate/regd: rebase systemfs handlers over fsobstacks --- lib/copperplate/regd/fs-cobalt.c | 47 +++- lib/copperplate/regd/fs-common.c | 61 + lib/copperplate/regd/fs-mercury.c | 12 ++-- lib/copperplate/regd/regd.c |2 +- lib/copperplate/regd/sysregfs.h | 14 +++-- 5 files changed, 66 insertions(+), 70 deletions(-) diff --git a/lib/copperplate/regd/fs-cobalt.c b/lib/copperplate/regd/fs-cobalt.c index 1260e59..b7c1034 100644 --- a/lib/copperplate/regd/fs-cobalt.c +++ b/lib/copperplate/regd/fs-cobalt.c @@ -88,43 +88,24 @@ char *format_thread_status(const struct thread_data *p, char *buf, size_t len) */ #define PROC_PULL_HANDLER(__name, __path) \ -ssize_t read_ ## __name(struct fsobj *fsobj, char *buf, \ - size_t size, off_t offset, \ - void *priv) \ +int open_ ## __name(struct fsobj *fsobj, void *priv) \ { \ - return pull_proc_data("/proc/xenomai/" __path, buf, size); \ + return pull_proc_data("/proc/xenomai/" __path, priv); \ } /* * Cobalt-specific helper to pull the /proc vfile data provided by the * nucleus over a fuse-managed vfile. */ -static ssize_t pull_proc_data(const char *procpath, char *buf, size_t size) +static int pull_proc_data(const char *path, struct fsobstack *o) { - size_t len = 0; - FILE *fp; - int c; - - if (size == 0) - return 0; - - fp = fopen(procpath, "r"); - if (fp == NULL) - return -errno; - - while (len < size) { - c = fgetc(fp); - if (c == EOF) { - if (ferror(fp)) - len = -errno; - break; - } - buf[len++] = c; - } + int len; - fclose(fp); + fsobstack_init(o); + len = fsobstack_grow_file(o, path); + fsobstack_finish(o); - return (ssize_t)len; + return len < 0 ? len : 0; } PROC_PULL_HANDLER(threads, "/sched/threads"); @@ -143,21 +124,27 @@ struct sysreg_fsfile sysreg_files[] = { .path = "/threads", .mode = O_RDONLY, .ops = { - .read = read_threads, + .open = open_threads, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/heaps", .mode = O_RDONLY, .ops = { - .read = read_heaps, + .open = open_heaps, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { .path = "/version", .mode = O_RDONLY, .ops = { - .read = read_version, + .open = open_version, + .release = fsobj_obstack_release, + .read = fsobj_obstack_read }, }, { diff --git a/lib/copperplate/regd/fs-common.c b/lib/copperplate/regd/fs-common.c index b689b44..6346320 100644 --- a/lib/copperplate/regd/fs-common.c +++ b/lib/copperplate/regd/fs-common.c @@ -67,23 +67,23 @@ static char *format_time(ticks_t value, char *buf, size_t bufsz) return buf; } -ssize_t read_threads(struct fsobj *fsobj, char *buf, -size_t size, off_t offset, -void *priv) +int open_threads(struct fsobj *fsobj, void *priv) { struct thread_data *thread_data, *p; char sbuf[64], pbuf[16], tbuf[64]; struct threadobj_stat statbuf; struct sysgroup_memspec *obj; + struct fsobstack *o = priv; struct threadobj *thobj; const char *sched_class; - ssize_t len = 0; - int ret, count; + int ret, count, len = 0; ret = heapobj_bind_session(__node_info.session_label); if (ret) return ret; + fsobstack_init(o); + sysgroup_lock(); count = sysgroup_count(thread); sysgroup_unlock(); @@ -132,9 +132,9 @@ ssize_t read_threads(struct fsobj *fsobj, char *buf, if (count == 0) goto out_free; - len = sprintf(buf, "%-3s %-6s %-5s %-8s %-8s %-10s %s\n", - "CPU", "PID", "CLASS", "PRI", "TIMEOUT", - "STAT", "N