[Xenomai-git] Philippe Gerum : copperplate/heapobj-pshared: fix minimum size in heap creation
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
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
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
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
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
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()
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
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
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
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
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
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
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
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