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(¤t->sobj_msg, &syns); _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git