From 9887bca23aec6102d2259ced053549acf137eb9e Mon Sep 17 00:00:00 2001 From: Petr Benes Date: Tue, 8 Feb 2011 16:30:23 +0100 Subject: [PATCH] Fixed synchronization for codec buffer. --- src/exec_req.c | 14 +++++++++++--- src/executor.c | 2 ++ src/executor.h | 3 +++ src/iop.c | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/exec_req.c b/src/exec_req.c index e836dd1..2f84c10 100644 --- a/src/exec_req.c +++ b/src/exec_req.c @@ -96,15 +96,23 @@ void forb_exec_req_process(forb_exec_req_t *exec_req) // The local invocation case if ((exec_req->request_type = FORB_EXEC_REQ_LOCAL)) { - *(exec_req->input_request->cdr_reply) = reply_codec; //FIXME: better without copying? + forb_request_t *request = exec_req->input_request; + forb_executor_t *executor = exec_req->obj->executor; + + request->cdr_reply = &reply_codec; + /* Tell the stub where to signal that reply processing is + * finished */ + request->reply_processed = &executor->reply_processed; // notify that the reply is ready - forb_syncobj_signal(&exec_req->input_request->reply_ready); + forb_syncobj_signal(&request->reply_ready); + /* Wait for stub to process the results from the codec's buffer */ + forb_syncobj_wait(&executor->reply_processed); } else { forb_iop_send_reply(forb, &exec_req->source, &reply_codec, exec_req->request_id, &env); } - FORB_CDR_codec_release_buffer(&reply_codec); + FORB_CDR_codec_release_buffer(&reply_codec); forb_exec_req_destroy(exec_req); } diff --git a/src/executor.c b/src/executor.c index f1a068d..7e75eb8 100644 --- a/src/executor.c +++ b/src/executor.c @@ -86,6 +86,8 @@ int forb_executor_init(forb_executor_t *executor) if (ret) return ret; forb_exec_req_nolock_init_head(executor); + + forb_syncobj_init(&executor->reply_processed, 0); return 0; } diff --git a/src/executor.h b/src/executor.h index 06dddcd..f3cad30 100644 --- a/src/executor.h +++ b/src/executor.h @@ -59,6 +59,8 @@ #include #include #include +#include + /** * Executor structure. @@ -74,6 +76,7 @@ typedef struct forb_executor { fosa_mutex_t mutex; /**< Mutex for protecting forb_executor_t::requests. */ fosa_cond_t new_request_in_empty_list; /**< Signaled when a request was added to the empty list. */ ul_list_head_t requests; /**< List of pending requests for this executor. */ + forb_syncobj_t reply_processed; /**< Synchronization object for signaling the receiver thread to continue processing after the reply is processed by a stub. */ } forb_executor_t; diff --git a/src/iop.c b/src/iop.c index f010ac4..c7ab0c9 100644 --- a/src/iop.c +++ b/src/iop.c @@ -759,7 +759,7 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env) exec_req->input_request = req; exec_req->obj = exec_req->input_request->obj; //exec_req->method_index = req.method_index; - exec_req->codec = exec_req->input_request->cdr_request; //FIXME: or better without copying? + exec_req->codec = exec_req->input_request->cdr_request; exec_req->request_id = exec_req->input_request->request_id; forb_exec_req_ins_tail(forb_object_get_executor(exec_req->obj), exec_req); return; -- 2.39.2