[Xenomai-git] Philippe Gerum : copperplate/heapobj-pshared: fix minimum size in heap creation

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: a10eca3633e847951e4add3a2b8816a113a46606
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=a10eca3633e847951e4add3a2b8816a113a46606

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 10:15:55 2011 +0100

copperplate/heapobj-pshared: fix minimum size in heap creation

---

 lib/copperplate/heapobj-pshared.c |   19 ---
 1 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/lib/copperplate/heapobj-pshared.c 
b/lib/copperplate/heapobj-pshared.c
index bfc8a4f..6875932 100644
--- a/lib/copperplate/heapobj-pshared.c
+++ b/lib/copperplate/heapobj-pshared.c
@@ -564,13 +564,18 @@ static int create_heap(struct heapobj *hobj, const char 
*session,
memoff_t len;
int ret, fd;
 
-   if (size = sizeof(struct heap_extent))
-   size = sizeof(struct heap_extent);
-   else {
-   size = __align_to(size, HOBJ_PAGE_SIZE);
-   if (size  HOBJ_MAXEXTSZ)
-   return __bt(-EINVAL);
-   }
+   /*
+* A storage page should be obviously larger than an extent
+* header, but we still make sure of this in debug mode, so
+* that we can rely on __align_to() for rounding to the
+* minimum size in production builds, without any further
+* test (e.g. like size = sizeof(struct heap_extent)).
+*/
+   assert(HOBJ_PAGE_SIZE  sizeof(struct heap_extent));
+
+   size = __align_to(size, HOBJ_PAGE_SIZE);
+   if (size  HOBJ_MAXEXTSZ)
+   return __bt(-EINVAL);
 
if (size - sizeof(struct heap_extent)  HOBJ_PAGE_SIZE * 2)
size += HOBJ_PAGE_SIZE * 2;


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/debug: fix async-unsafe sections

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 6539b8c1641bf9ad31384ba197c82a892c7ed0dc
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6539b8c1641bf9ad31384ba197c82a892c7ed0dc

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 10:33:02 2011 +0100

copperplate/debug: fix async-unsafe sections

---

 lib/copperplate/debug.c |   12 +++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/lib/copperplate/debug.c b/lib/copperplate/debug.c
index a02eb3b..fce9455 100644
--- a/lib/copperplate/debug.c
+++ b/lib/copperplate/debug.c
@@ -49,14 +49,17 @@ void backtrace_log(int retval, const char *fn,
 {
struct backtrace_data *btd;
struct error_frame *ef;
+   int state;
 
btd = pthread_getspecific(btkey);
if (btd == NULL)
btd = main_btd;
 
+   pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, state);
+
ef = xnmalloc(sizeof(*ef));
if (ef == NULL)
-   return;
+   goto out;
 
ef-retval = retval;
ef-lineno = lineno;
@@ -73,14 +76,19 @@ void backtrace_log(int retval, const char *fn,
btd-inner = ef;
 
write_unlock(btd-lock);
+out:
+   pthread_setcanceltype(state, NULL);
 }
 
 static void flush_backtrace(struct backtrace_data *btd)
 {
struct error_frame *ef, *nef;
+   int state;
 
/* Locking order must be __printlock, then btlock. */
 
+   pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, state);
+
write_lock(btd-lock);
 
for (ef = btd-inner; ef; ef = nef) {
@@ -90,6 +98,8 @@ static void flush_backtrace(struct backtrace_data *btd)
 
btd-inner = NULL;
write_unlock(btd-lock);
+
+   pthread_setcanceltype(state, NULL);
 }
 
 void backtrace_init_context(struct backtrace_data *btd,


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/heapobj-pshared: fix matching error paths in iterators

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: ceb132b7cc4969431855ee6f110f217d21bb851c
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ceb132b7cc4969431855ee6f110f217d21bb851c

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 10:22:36 2011 +0100

copperplate/heapobj-pshared: fix matching error paths in iterators

---

 lib/copperplate/heapobj-pshared.c |   27 ---
 1 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/lib/copperplate/heapobj-pshared.c 
b/lib/copperplate/heapobj-pshared.c
index 6875932..cc64cb9 100644
--- a/lib/copperplate/heapobj-pshared.c
+++ b/lib/copperplate/heapobj-pshared.c
@@ -333,13 +333,13 @@ static void *alloc_block(struct heap *heap, size_t size)
--heap-buckets[ilog].fcount;
 
/* Search for the source extent of block. */
-   extent = NULL;
__list_for_each_entry(heap, extent, heap-extents, 
link) {
if (__moff(heap, block) = extent-membase 
__moff(heap, block)  extent-memlim)
-   break;
+   goto found;
}
-   assert(extent != NULL);
+   assert(0);
+   found:
pnum = (__moff(heap, block) - extent-membase)  
HOBJ_PAGE_SHIFT;
++extent-pagemap[pnum].bcount;
}
@@ -368,7 +368,7 @@ static int free_block(struct heap *heap, void *block)
caddr_t freepage, lastpage, nextpage, tailpage, freeptr;
int log2size, ret = 0, nblocks, xpage, ilog;
size_t pnum, pcont, boffset, bsize, npages;
-   struct heap_extent *extent = NULL;
+   struct heap_extent *extent;
memoff_t *tailptr;
 
write_lock_nocancel(heap-lock);
@@ -380,14 +380,12 @@ static int free_block(struct heap *heap, void *block)
__list_for_each_entry(heap, extent, heap-extents, link) {
if (__moff(heap, block) = extent-membase 
__moff(heap, block)  extent-memlim)
-   break;
-   }
-
-   if (extent == NULL) {
-   ret = -EFAULT;
-   goto out;
+   goto found;
}
 
+   ret = -EFAULT;
+   goto out;
+found:
/* Compute the heading page number in the page map. */
pnum = (__moff(heap, block) - extent-membase)  HOBJ_PAGE_SHIFT;
boffset = (__moff(heap, block) -
@@ -521,7 +519,7 @@ out:
 static size_t check_block(struct heap *heap, void *block)
 {
size_t pnum, boffset, bsize, ret = 0;
-   struct heap_extent *extent = NULL;
+   struct heap_extent *extent;
int ptype;
 
read_lock_nocancel(heap-lock);
@@ -532,11 +530,10 @@ static size_t check_block(struct heap *heap, void *block)
__list_for_each_entry(heap, extent, heap-extents, link) {
if (__moff(heap, block) = extent-membase 
__moff(heap, block)  extent-memlim)
-   break;
+   goto found;
}
-   if (extent == NULL)
-   goto out;
-
+   goto out;
+found:
/* Compute the heading page number in the page map. */
pnum = (__moff(heap, block) - extent-membase)  HOBJ_PAGE_SHIFT;
ptype = extent-pagemap[pnum].type;


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/queue: various fixes

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 782367d90d5eeba0c776738ae0c034906cb9bc98
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=782367d90d5eeba0c776738ae0c034906cb9bc98

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 10:46:38 2011 +0100

alchemy/queue: various fixes

---

 include/alchemy/queue.h |2 +-
 lib/alchemy/queue.c |   13 -
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/include/alchemy/queue.h b/include/alchemy/queue.h
index 0f9645d..b9d68f5 100644
--- a/include/alchemy/queue.h
+++ b/include/alchemy/queue.h
@@ -76,7 +76,7 @@ int rt_queue_free(RT_QUEUE *queue,
  void *buf);
 
 int rt_queue_send(RT_QUEUE *queue,
- void *buf,
+ const void *buf,
  size_t size,
  int mode);
 
diff --git a/lib/alchemy/queue.c b/lib/alchemy/queue.c
index 3178102..64e19ae 100644
--- a/lib/alchemy/queue.c
+++ b/lib/alchemy/queue.c
@@ -93,7 +93,7 @@ int rt_queue_create(RT_QUEUE *queue, const char *name,
if (threadobj_irq_p())
return -EPERM;
 
-   if (poolsize == 0)
+   if (poolsize == 0 || (mode  ~Q_PRIO) != 0)
return -EINVAL;
 
COPPERPLATE_PROTECT(svc);
@@ -239,7 +239,7 @@ out:
 }
 
 int rt_queue_send(RT_QUEUE *queue,
- void *buf, size_t size, int mode)
+ const void *buf, size_t size, int mode)
 {
struct alchemy_queue_wait *wait;
struct alchemy_queue_msg *msg;
@@ -343,8 +343,8 @@ ssize_t rt_queue_receive_until(RT_QUEUE *queue,
goto out;
}
 
-   msg = list_pop_entry(qcb-mq, struct alchemy_queue_msg, next);
-   if (msg) {
+   if (!list_empty(qcb-mq)) {
+   msg = list_pop_entry(qcb-mq, struct alchemy_queue_msg, next);
msg-refcount++;
*bufp = msg + 1;
ret = (ssize_t)msg-size;
@@ -403,6 +403,7 @@ ssize_t rt_queue_read_until(RT_QUEUE *queue,
 {
ssize_t rsize;
void *_buf;
+   int ret;
 
rsize = rt_queue_receive_until(queue, _buf, timeout);
if (rsize  0)
@@ -414,7 +415,9 @@ ssize_t rt_queue_read_until(RT_QUEUE *queue,
if (size  0)
memcpy(buf, _buf, size);
 
-   rt_queue_free(queue, _buf);
+   ret = rt_queue_free(queue, _buf);
+   if (ret)
+   return __bt(ret);
 
return rsize;
 }


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: introduce queue-related tests

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: c162254fc3c1da6dd50d0580e469b82f73f67d3e
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c162254fc3c1da6dd50d0580e469b82f73f67d3e

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 12:18:23 2011 +0100

alchemy/testsuite: introduce queue-related tests

---

 lib/alchemy/testsuite/Makefile |5 +-
 lib/alchemy/testsuite/mq-1.c   |  106 +++
 lib/alchemy/testsuite/mq-2.c   |  112 +
 lib/alchemy/testsuite/mq-3.c   |  120 
 4 files changed, 342 insertions(+), 1 deletions(-)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 5ca5280..fda4ff0 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -16,7 +16,10 @@ TESTS := \
task-2  \
task-3  \
task-4  \
-   task-5
+   task-5  \
+   mq-1\
+   mq-2\
+   mq-3
 
 CFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --cflags) -g
 LDFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --ldflags)
diff --git a/lib/alchemy/testsuite/mq-1.c b/lib/alchemy/testsuite/mq-1.c
new file mode 100644
index 000..6c5e892
--- /dev/null
+++ b/lib/alchemy/testsuite/mq-1.c
@@ -0,0 +1,106 @@
+#include stdio.h
+#include stdlib.h
+#include copperplate/init.h
+#include copperplate/traceobj.h
+#include alchemy/task.h
+#include alchemy/queue.h
+
+static struct traceobj trobj;
+
+#define NMESSAGES (sizeof(messages) / sizeof(messages[0]))
+
+static int messages[] = {
+   0xfafafafa,
+   0xbebebebe,
+   0xcdcdcdcd,
+   0xabcdefff,
+   0x12121212,
+   0x34343434,
+   0x56565656,
+   0x78787878,
+   0xdededede,
+   0xbcbcbcbc
+};
+
+static void main_task(void *arg)
+{
+   RT_QUEUE_INFO info;
+   int ret, msg = 0;
+   RT_QUEUE q;
+
+   traceobj_enter(trobj);
+
+   ret = rt_queue_create(q, QUEUE, sizeof(messages), Q_UNLIMITED, 
0x);
+   traceobj_assert(trobj, ret == -EINVAL);
+
+   ret = rt_queue_create(q, QUEUE, 0, NMESSAGES, Q_FIFO);
+   traceobj_assert(trobj, ret == -EINVAL);
+
+   ret = rt_queue_create(q, QUEUE, sizeof(messages), Q_UNLIMITED, 
Q_FIFO);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_queue_delete(q);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_queue_create(q, QUEUE, sizeof(messages), NMESSAGES, Q_PRIO);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_queue_inquire(q, info);
+   traceobj_assert(trobj, ret == 0);
+   traceobj_assert(trobj, info.nmessages == 0);
+
+   ret = rt_queue_write(q, messages[0], sizeof(int), Q_NORMAL);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_queue_inquire(q, info);
+   traceobj_assert(trobj, ret == 0);
+   traceobj_assert(trobj, info.nmessages == 1);
+
+   ret = rt_queue_write(q, messages[1], sizeof(int), Q_NORMAL);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_queue_inquire(q, info);
+   traceobj_assert(trobj, ret == 0);
+   traceobj_assert(trobj, info.nmessages == 2);
+
+   ret = rt_queue_read(q, msg, sizeof(msg), TM_NONBLOCK);
+   traceobj_assert(trobj, ret == sizeof(msg));
+   traceobj_assert(trobj, msg == 0xfafafafa);
+
+   ret = rt_queue_inquire(q, info);
+   traceobj_assert(trobj, ret == 0);
+   traceobj_assert(trobj, info.nmessages == 1);
+
+   ret = rt_queue_read(q, msg, sizeof(msg), TM_NONBLOCK);
+   traceobj_assert(trobj, ret == sizeof(msg));
+   traceobj_assert(trobj, msg == 0xbebebebe);
+
+   ret = rt_queue_inquire(q, info);
+   traceobj_assert(trobj, ret == 0);
+   traceobj_assert(trobj, info.nmessages == 0);
+
+   ret = rt_queue_read(q, msg, sizeof(msg), 100);
+   traceobj_assert(trobj, ret == -ETIMEDOUT); 
+
+   ret = rt_queue_delete(q);
+   traceobj_assert(trobj, ret == 0);
+
+   traceobj_exit(trobj);
+}
+
+int main(int argc, char *argv[])
+{
+   RT_TASK t_main;
+   int ret;
+
+   copperplate_init(argc, argv);
+
+   traceobj_init(trobj, argv[0], 0);
+
+   ret = rt_task_spawn(t_main, main_task, 0,  50, 0, main_task, NULL);
+   traceobj_assert(trobj, ret == 0);
+
+   traceobj_join(trobj);
+
+   exit(0);
+}
diff --git a/lib/alchemy/testsuite/mq-2.c b/lib/alchemy/testsuite/mq-2.c
new file mode 100644
index 000..5a069e7
--- /dev/null
+++ b/lib/alchemy/testsuite/mq-2.c
@@ -0,0 +1,112 @@
+#include stdio.h
+#include stdlib.h
+#include copperplate/init.h
+#include copperplate/traceobj.h
+#include alchemy/task.h
+#include alchemy/queue.h
+
+static struct traceobj trobj;
+
+static int tseq[] = {
+   3, 4, 5, 6,
+   1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
+   7,
+};
+
+#define NMESSAGES ((sizeof(messages) / sizeof(messages[0])) - 1)
+
+static int messages[] = {
+   0xfafafafa,
+   

[Xenomai-git] Philippe Gerum : alchemy/queue: fix buffer leakage on unmatched broadcast write

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: b55c7d7c4985a85fbfa1a23e6042fac96a0da830
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=b55c7d7c4985a85fbfa1a23e6042fac96a0da830

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 13:10:30 2011 +0100

alchemy/queue: fix buffer leakage on unmatched broadcast write

---

 lib/alchemy/queue.c |6 +-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/lib/alchemy/queue.c b/lib/alchemy/queue.c
index 64e19ae..8bad9fe 100644
--- a/lib/alchemy/queue.c
+++ b/lib/alchemy/queue.c
@@ -312,6 +312,7 @@ int rt_queue_write(RT_QUEUE *queue,
   const void *buf, size_t size, int mode)
 {
void *_buf;
+   int ret;
 
_buf = rt_queue_alloc(queue, size);
if (_buf == NULL)
@@ -320,7 +321,10 @@ int rt_queue_write(RT_QUEUE *queue,
if (size  0)
memcpy(_buf, buf, size);
 
-   return rt_queue_send(queue, _buf, size, mode);
+   ret = rt_queue_send(queue, _buf, size, mode);
+   if (ret == 0  (mode  Q_BROADCAST))
+   /* Nobody received, free the temp buffer. */
+   rt_queue_free(queue, _buf);
 }
 
 ssize_t rt_queue_receive_until(RT_QUEUE *queue,


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/queue: fix return value from rt_queue_write()

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 659937ce574a47ac7a50ff91716dec53bd882e6c
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=659937ce574a47ac7a50ff91716dec53bd882e6c

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 16:43:31 2011 +0100

alchemy/queue: fix return value from rt_queue_write()

---

 lib/alchemy/queue.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/alchemy/queue.c b/lib/alchemy/queue.c
index 8bad9fe..0a6e98c 100644
--- a/lib/alchemy/queue.c
+++ b/lib/alchemy/queue.c
@@ -325,6 +325,8 @@ int rt_queue_write(RT_QUEUE *queue,
if (ret == 0  (mode  Q_BROADCAST))
/* Nobody received, free the temp buffer. */
rt_queue_free(queue, _buf);
+
+   return ret;
 }
 
 ssize_t rt_queue_receive_until(RT_QUEUE *queue,


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: extend tests to message passing services

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 5c3db0eef5e4850d969b00da02b2a87d79690362
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=5c3db0eef5e4850d969b00da02b2a87d79690362

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 18:47:32 2011 +0100

alchemy/testsuite: extend tests to message passing services

---

 lib/alchemy/testsuite/Makefile |1 +
 lib/alchemy/testsuite/task-6.c |   80 
 2 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index fda4ff0..3048581 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -17,6 +17,7 @@ TESTS :=  \
task-3  \
task-4  \
task-5  \
+   task-6  \
mq-1\
mq-2\
mq-3
diff --git a/lib/alchemy/testsuite/task-6.c b/lib/alchemy/testsuite/task-6.c
new file mode 100644
index 000..47f5d22
--- /dev/null
+++ b/lib/alchemy/testsuite/task-6.c
@@ -0,0 +1,80 @@
+#include stdio.h
+#include stdlib.h
+#include copperplate/init.h
+#include copperplate/traceobj.h
+#include alchemy/task.h
+
+static struct traceobj trobj;
+
+static RT_TASK t_bgnd, t_fgnd;
+
+static void background_task(void *arg)
+{
+   int msg, ret, flowid, n;
+   RT_TASK_MCB mcb;
+
+   traceobj_enter(trobj);
+
+   for (n = 0; n  10; n++) {
+   mcb.data = msg;
+   mcb.size = sizeof(msg);
+   flowid = rt_task_receive(mcb, TM_INFINITE);
+   traceobj_assert(trobj, flowid  0);
+   traceobj_assert(trobj, mcb.opcode == 0x77);
+   traceobj_assert(trobj, mcb.size == sizeof(msg));
+   traceobj_assert(trobj, msg == n);
+   msg = ~msg;
+   ret = rt_task_reply(flowid, mcb);
+   traceobj_assert(trobj, ret == 0);
+   }
+
+   traceobj_exit(trobj);
+}
+
+static void foreground_task(void *arg)
+{
+   RT_TASK_MCB mcb, mcb_r;
+   int ret, msg, notmsg;
+
+   traceobj_enter(trobj);
+
+   for (msg = 0; msg  10; msg++) {
+   rt_task_sleep(100);
+   mcb.opcode = 0x77;
+   mcb.data = msg;
+   mcb.size = sizeof(msg);
+   mcb_r.data = notmsg;
+   mcb_r.size = sizeof(notmsg);
+   notmsg = msg;
+   ret = rt_task_send(t_bgnd, mcb, mcb_r, TM_INFINITE);
+   traceobj_assert(trobj, ret == sizeof(msg));
+   traceobj_assert(trobj, notmsg == ~msg);
+   }
+
+   traceobj_exit(trobj);
+}
+
+int main(int argc, char *argv[])
+{
+   int ret;
+
+   copperplate_init(argc, argv);
+
+   traceobj_init(trobj, argv[0], 0);
+
+   ret = rt_task_create(t_bgnd, BGND, 0,  20, 0);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_task_start(t_bgnd, background_task, NULL);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_task_create(t_fgnd, FGND, 0,  21, 0);
+   traceobj_assert(trobj, ret == 0);
+
+   ret = rt_task_start(t_fgnd, foreground_task, NULL);
+   traceobj_assert(trobj, ret == 0);
+
+   traceobj_join(trobj);
+
+   exit(0);
+}


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy: fix message-passing services

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: e1bf3e3c2c5ae2e55d1fa4937be469f252226b32
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e1bf3e3c2c5ae2e55d1fa4937be469f252226b32

Author: Philippe Gerum r...@xenomai.org
Date:   Mon Nov  7 18:47:06 2011 +0100

alchemy: fix message-passing services

---

 include/alchemy/task.h |4 ++--
 lib/alchemy/task.c |   32 +++-
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/include/alchemy/task.h b/include/alchemy/task.h
index 862ff0b..cd0e164 100644
--- a/include/alchemy/task.h
+++ b/include/alchemy/task.h
@@ -51,8 +51,8 @@ typedef struct RT_TASK RT_TASK;
 struct RT_TASK_MCB {
int flowid;
int opcode;
-   caddr_t data;
-   size_t size;
+   void *data;
+   ssize_t size;
 };
 
 typedef struct RT_TASK_MCB RT_TASK_MCB;
diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index 3b9ab10..40baee5 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -728,7 +728,8 @@ ssize_t rt_task_send_until(RT_TASK *task,
struct alchemy_task *tcb;
struct syncstate syns;
struct service svc;
-   int ret = 0;
+   ssize_t ret;
+   int err;
 
current = threadobj_current();
if (current == NULL)
@@ -736,9 +737,11 @@ ssize_t rt_task_send_until(RT_TASK *task,
 
COPPERPLATE_PROTECT(svc);
 
-   tcb = get_alchemy_task(task, ret);
-   if (tcb == NULL)
+   tcb = get_alchemy_task(task, err);
+   if (tcb == NULL) {
+   ret = err;
goto out;
+   }
 
/*
 * If we grabbed a lock on the remote task successfully, then
@@ -773,7 +776,13 @@ ssize_t rt_task_send_until(RT_TASK *task,
 
wait-request = *mcb_s;
wait-request.flowid = tcb-flowgen;
-   wait-reply.size = mcb_r ? mcb_r-size : 0;
+   if (mcb_r) {
+   wait-reply.data = mcb_r-data;
+   wait-reply.size = mcb_r-size;
+   } else {
+   wait-reply.data = NULL;
+   wait-reply.size = 0;
+   }
 
if (syncobj_drain_count(tcb-sobj_msg))
syncobj_signal_drain(tcb-sobj_msg);
@@ -787,6 +796,7 @@ ssize_t rt_task_send_until(RT_TASK *task,
goto out;
goto done;
}
+   ret = wait-reply.size;
 
threadobj_finish_wait();
 done:
@@ -909,13 +919,17 @@ int rt_task_reply(int flowid, RT_TASK_MCB *mcb_s)
 * it back any reply data. What is invalid is sending a
 * response larger than what the client expects.
 */
-   if (mcb_r-size  size)
-   ret = -ENOBUFS;
-   else if (size  0)
-   memcpy(mcb_r-data, mcb_s-data, size);
+   if (mcb_r-size  size) {
+   ret = -ENOBUFS; /* Client will get this too. */
+   mcb_r-size = -ENOBUFS;
+   } else {
+   ret = 0;
+   mcb_r-size = size;
+   if (size  0)
+   memcpy(mcb_r-data, mcb_s-data, size);
+   }
 
mcb_r-flowid = flowid;
-   mcb_r-size = size;
mcb_r-opcode = mcb_s ? mcb_s-opcode : 0;
 done:
syncobj_unlock(current-sobj_msg, syns);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : threadobj: move calls to debug after threadobj key initialization

2011-11-07 Thread GIT version control
Module: xenomai-gch
Branch: for-forge
Commit: f6196d62378c99cd7cae7974f7e12e0e3ae05a2f
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=f6196d62378c99cd7cae7974f7e12e0e3ae05a2f

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Mon Nov  7 21:32:24 2011 +0100

threadobj: move calls to debug after threadobj key initialization

as debug uses threadobj_current().

---

 lib/copperplate/threadobj.c |   12 ++--
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 685e979..8025786 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -689,7 +689,7 @@ int threadobj_start_rr(struct timespec *quantum)
 
value.it_interval.tv_sec = quantum-tv_sec;
value.it_interval.tv_usec = quantum-tv_nsec / 1000;
-   
+
ret = getitimer(ITIMER_VIRTUAL, ovalue);
if (ret == 0 
value.it_interval.tv_sec == ovalue.it_interval.tv_sec 
@@ -718,7 +718,7 @@ void threadobj_stop_rr(void)
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 0;
value.it_interval = value.it_value;
-   
+
setitimer(ITIMER_VIRTUAL, value, NULL);
 
memset(sa, 0, sizeof(sa));
@@ -774,7 +774,7 @@ int threadobj_wait_period(struct threadobj *thobj,
overruns = d / period;
timespec_adds(wakeup, wakeup, overruns * period);
}
-   
+
timespec_adds(thobj-core.wakeup, wakeup, period);
 
if (overruns)
@@ -1029,14 +1029,14 @@ void threadobj_pkg_init(void)
threadobj_irq_prio = __RT(sched_get_priority_max(SCHED_RT));
threadobj_high_prio = threadobj_irq_prio - 1;
 
-   debug(SCHED_RT priorities = [1 .. %d], threadobj_irq_prio);
-   debug(SCHED_RT.%d reserved for timer context, threadobj_irq_prio);
-
/* PI and recursion would be overkill. */
__RT(pthread_mutex_init(list_lock, NULL));
 
if (pthread_key_create(threadobj_tskey, threadobj_finalize) != 0)
panic(failed to allocate TSD key);
 
+   debug(SCHED_RT priorities = [1 .. %d], threadobj_irq_prio);
+   debug(SCHED_RT.%d reserved for timer context, threadobj_irq_prio);
+
pkg_init_corespec();
 }


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : arm: fix __xn_rdtsc

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 13be7f09edcd21586998f3c17c8d47b7edc4f8ef
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=13be7f09edcd21586998f3c17c8d47b7edc4f8ef

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Mon Nov  7 21:31:25 2011 +0100

arm: fix __xn_rdtsc

---

 configure|4 ++--
 configure.in |2 +-
 lib/include/xeno_config.h.in |6 +++---
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/configure b/configure
index ba6b773..fdde4ce 100755
--- a/configure
+++ b/configure
@@ -12581,9 +12581,9 @@ $as_echo #define CONFIG_XENO_ARM_SA1100 1 confdefs.h
 test x$CONFIG_XENO_CPU_XSC3 = xy 
 $as_echo #define CONFIG_XENO_CPU_XSC3 1 confdefs.h
 
-test $XNARCH_ARM_TSC_TYPE 
+test $CONFIG_XENO_ARM_TSC_TYPE 
 cat confdefs.h _ACEOF
-#define XNARCH_ARM_TSC_TYPE $XNARCH_ARM_TSC_TYPE
+#define CONFIG_XENO_ARM_TSC_TYPE $CONFIG_XENO_ARM_TSC_TYPE
 _ACEOF
 
  if test $enable_shared = 'yes'; then
diff --git a/configure.in b/configure.in
index 259ba32..04b615b 100644
--- a/configure.in
+++ b/configure.in
@@ -498,7 +498,7 @@ test -n $CONFIG_XENO_ARM_ARCH  
AC_DEFINE_UNQUOTED(CONFIG_XENO_ARM_ARCH,$CONF
 
 test x$CONFIG_XENO_ARM_SA1100 = xy  
AC_DEFINE(CONFIG_XENO_ARM_SA1100,1,[config])
 test x$CONFIG_XENO_CPU_XSC3 = xy  AC_DEFINE(CONFIG_XENO_CPU_XSC3,1,[config])
-test $XNARCH_ARM_TSC_TYPE  
AC_DEFINE_UNQUOTED(XNARCH_ARM_TSC_TYPE,$XNARCH_ARM_TSC_TYPE,[config])
+test $CONFIG_XENO_ARM_TSC_TYPE  
AC_DEFINE_UNQUOTED(CONFIG_XENO_ARM_TSC_TYPE,$CONFIG_XENO_ARM_TSC_TYPE,[config])
 AM_CONDITIONAL(CONFIG_XENO_SHARED,[test $enable_shared = 'yes'])
 
 # Default sampling period (ns) used in various tests
diff --git a/lib/include/xeno_config.h.in b/lib/include/xeno_config.h.in
index fec956f..cebf430 100644
--- a/lib/include/xeno_config.h.in
+++ b/lib/include/xeno_config.h.in
@@ -13,6 +13,9 @@
 #undef CONFIG_XENO_ARM_SA1100
 
 /* config */
+#undef CONFIG_XENO_ARM_TSC_TYPE
+
+/* config */
 #undef CONFIG_XENO_ASYNC_CANCEL
 
 /* Build system alias */
@@ -174,9 +177,6 @@
 /* Version number of package */
 #undef VERSION
 
-/* config */
-#undef XNARCH_ARM_TSC_TYPE
-
 /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
`char[]'. */
 #undef YYTEXT_POINTER


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : threadobj: move calls to debug after threadobj key initialization

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: f6196d62378c99cd7cae7974f7e12e0e3ae05a2f
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=f6196d62378c99cd7cae7974f7e12e0e3ae05a2f

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Mon Nov  7 21:32:24 2011 +0100

threadobj: move calls to debug after threadobj key initialization

as debug uses threadobj_current().

---

 lib/copperplate/threadobj.c |   12 ++--
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 685e979..8025786 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -689,7 +689,7 @@ int threadobj_start_rr(struct timespec *quantum)
 
value.it_interval.tv_sec = quantum-tv_sec;
value.it_interval.tv_usec = quantum-tv_nsec / 1000;
-   
+
ret = getitimer(ITIMER_VIRTUAL, ovalue);
if (ret == 0 
value.it_interval.tv_sec == ovalue.it_interval.tv_sec 
@@ -718,7 +718,7 @@ void threadobj_stop_rr(void)
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 0;
value.it_interval = value.it_value;
-   
+
setitimer(ITIMER_VIRTUAL, value, NULL);
 
memset(sa, 0, sizeof(sa));
@@ -774,7 +774,7 @@ int threadobj_wait_period(struct threadobj *thobj,
overruns = d / period;
timespec_adds(wakeup, wakeup, overruns * period);
}
-   
+
timespec_adds(thobj-core.wakeup, wakeup, period);
 
if (overruns)
@@ -1029,14 +1029,14 @@ void threadobj_pkg_init(void)
threadobj_irq_prio = __RT(sched_get_priority_max(SCHED_RT));
threadobj_high_prio = threadobj_irq_prio - 1;
 
-   debug(SCHED_RT priorities = [1 .. %d], threadobj_irq_prio);
-   debug(SCHED_RT.%d reserved for timer context, threadobj_irq_prio);
-
/* PI and recursion would be overkill. */
__RT(pthread_mutex_init(list_lock, NULL));
 
if (pthread_key_create(threadobj_tskey, threadobj_finalize) != 0)
panic(failed to allocate TSD key);
 
+   debug(SCHED_RT priorities = [1 .. %d], threadobj_irq_prio);
+   debug(SCHED_RT.%d reserved for timer context, threadobj_irq_prio);
+
pkg_init_corespec();
 }


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Gilles Chanteperdrix : hal: add missing include

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 2ca888284930f92c7053ff29be6ec1c08993b671
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=2ca888284930f92c7053ff29be6ec1c08993b671

Author: Gilles Chanteperdrix gilles.chanteperd...@xenomai.org
Date:   Mon Nov  7 21:32:01 2011 +0100

hal: add missing include

---

 kernel/cobalt/arch/generic/hal.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/kernel/cobalt/arch/generic/hal.c b/kernel/cobalt/arch/generic/hal.c
index 30f2020..353637a 100644
--- a/kernel/cobalt/arch/generic/hal.c
+++ b/kernel/cobalt/arch/generic/hal.c
@@ -40,6 +40,9 @@
 #include asm/system.h
 #include asm/irq.h
 #include asm/xenomai/hal.h
+#ifdef CONFIG_PROC_FS
+#include linux/proc_fs.h
+#endif /* CONFIG_PROC_FS */
 #include stdarg.h
 
 MODULE_LICENSE(GPL);


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : debug: use safe memory allocator during early code execution

2011-11-07 Thread GIT version control
Module: xenomai-forge
Branch: master
Commit: 7bf542cd58eee99e80ee6c65166bb89550d435c3
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=7bf542cd58eee99e80ee6c65166bb89550d435c3

Author: Philippe Gerum r...@xenomai.org
Date:   Tue Nov  8 07:30:27 2011 +0100

debug: use safe memory allocator during early code execution

When a failure happens while initializing the internal real-time
allocator (e.g. heapobj_init() in phsared mode not being able to
obtain a shared memory segment), calling xnmalloc() to get memory for
the backtrace records is a really bad idea.

This patch makes sure to use the safe malloc/free calls in the debug
support code until the base system has fully initialized.

---

 include/copperplate/debug.h |3 +++
 lib/copperplate/debug.c |   34 --
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/include/copperplate/debug.h b/include/copperplate/debug.h
index 2811e2b..375b2c0 100644
--- a/include/copperplate/debug.h
+++ b/include/copperplate/debug.h
@@ -75,6 +75,8 @@ char *__get_error_buf(size_t *sizep);
 
 int debug_pkg_init(void);
 
+void debug_pkg_activate(void);
+
 #ifdef __cplusplus
 }
 #endif
@@ -122,6 +124,7 @@ struct backtrace_data {
})
 
 #define debug_pkg_init()   ({ 0; })
+#define debug_pkg_activate()   ({ 0; })
 
 #endif /* !__XENO_DEBUG__ */
 
diff --git a/lib/copperplate/debug.c b/lib/copperplate/debug.c
index fce9455..eb80296 100644
--- a/lib/copperplate/debug.c
+++ b/lib/copperplate/debug.c
@@ -35,6 +35,30 @@ static struct backtrace_data main_btd = {
.name = main,
 };
 
+static void *safe_malloc(size_t size)
+{
+   return malloc(size);
+}
+
+static void safe_free(void *p)
+{
+   free(p);
+}
+
+static void *fast_malloc(size_t size)
+{
+   return xnmalloc(size);
+}
+
+static void fast_free(void *p)
+{
+   xnfree(p);
+}
+
+static void *(*do_malloc)(size_t size) = safe_malloc;
+
+static void (*do_free)(void *p) = safe_free;
+
 void __debug(struct threadobj *thobj, const char *fmt, ...)
 {
va_list ap;
@@ -57,7 +81,7 @@ void backtrace_log(int retval, const char *fn,
 
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, state);
 
-   ef = xnmalloc(sizeof(*ef));
+   ef = do_malloc(sizeof(*ef));
if (ef == NULL)
goto out;
 
@@ -93,7 +117,7 @@ static void flush_backtrace(struct backtrace_data *btd)
 
for (ef = btd-inner; ef; ef = nef) {
nef = ef-next;
-   xnfree(ef);
+   do_free(ef);
}
 
btd-inner = NULL;
@@ -181,3 +205,9 @@ int debug_pkg_init(void)
__RT(pthread_mutex_init(main_btd.lock, NULL));
return -pthread_key_create(btkey, NULL);
 }
+
+void debug_pkg_activate(void)
+{
+   do_malloc = fast_malloc;
+   do_free = fast_free;
+}


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git