[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks

2014-04-24 Thread git repository hosting
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

2014-04-14 Thread git repository hosting
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

2014-04-11 Thread git repository hosting
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

2014-04-11 Thread git repository hosting
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