// 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);
}
#include <fosa.h>
#include <ul_list.h>
#include <forb/object_type.h>
+#include <forb/syncobj.h>
+
/**
* Executor structure.
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;
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;