]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Prepared for multiple executors in a single address space
authorPetr Benes <benesp16@fel.cvut.cz>
Tue, 8 Feb 2011 13:52:56 +0000 (14:52 +0100)
committerPetr Benes <benesp16@fel.cvut.cz>
Tue, 8 Feb 2011 13:52:56 +0000 (14:52 +0100)
Object implementation invocation prepared for a use of multiple
executors running in a single address space.

One can call the iop methods in the same way as for the case of
a remote invocation.

src/exec_req.c
src/exec_req.h
src/iop.c
src/request.h
src/tests/executor_calls.c

index e5b9c766d47e7982d8e4131abd1ad0d373563c4a..028c532411361085a73ba7124ff26836be430ba6 100644 (file)
@@ -93,10 +93,17 @@ void forb_exec_req_process(forb_exec_req_t *exec_req)
                                         &reply_codec,
                                         exec_req->obj,
                                         &env);
-       
-       forb_iop_send_reply(forb, &exec_req->source,
-                           &reply_codec,
-                           exec_req->request_id, &env);
+
+       // The local invocation case
+       if ((exec_req->request_type = local)) {
+               *(exec_req->input_request->cdr_reply) = reply_codec; //FIXME: better without copying?
+               // notify that the reply is ready
+               forb_syncobj_signal(&exec_req->input_request->reply_ready);
+       } else {
+               forb_iop_send_reply(forb, &exec_req->source,
+                               &reply_codec,
+                               exec_req->request_id, &env);            
+       }
        FORB_CDR_codec_release_buffer(&reply_codec);
        forb_exec_req_destroy(exec_req);
 }
index 57b17ba7da6610ed980ac10a24704b1f3f15b080..b8e2147a0fe9a950c49945cd51307aa50b801786 100644 (file)
 #include <forb/cdr.h>
 #include <ul_list.h>
 #include "executor.h"
+#include "request.h"
+
+/**
+ * Distinguishing execution methods of a request.
+ */
+enum FORB_EXEC_REQ_TYPE {
+       local,          // no serialization used
+       remote
+};
 
 /**
  * Request for ::forb_executor_t.
@@ -74,6 +83,8 @@ typedef struct forb_exec_req {
        unsigned method_index;  /**< Mehotd number to be invoked on the object @a obj. */
        FORB_CDR_Codec codec;   /**< Bufffer with serialized request parameters. */
        ul_list_node_t node;    /**< Node for forb_executor_t::requests. */
+       enum FORB_EXEC_REQ_TYPE request_type; /**< Execution method. */
+       forb_request_t *input_request; /**< Input request data for the case of local invocation */
 } forb_exec_req_t;
 
 UL_LIST_CUST_DEC(forb_exec_req_nolock, /* cust_prefix */
index 51330693aba314314b387304cfc6f198b840d9a2..248f94ab421b876374e8881a53cb288c6794e34f 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -388,6 +388,7 @@ process_request(forb_port_t *port, FORB_CDR_Codec *codec, uint32_t message_size)
        exec_req = forb_malloc(sizeof(*exec_req));
        if (exec_req) {
                memset(exec_req, 0, sizeof(exec_req));
+               exec_req->request_type = remote; 
                exec_req->request_id = request_header.request_id;
                exec_req->source = request_header.source;
                exec_req->obj = obj;
@@ -732,6 +733,7 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env)
        size_t len;
        fosa_abs_time_t timeout;
        forb_t *forb = forb_object_to_forb(req->obj);
+       forb_exec_req_t *exec_req;
 
        if (!forb) {
                env->major = FORB_EX_INTERNAL;
@@ -748,6 +750,21 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env)
                return;
        }
 
+       /* Local invocation case, destination of a message is only 
+        * a different executor thread */
+       if (forb_object_is_local(req->obj)) {
+               exec_req = forb_malloc(sizeof(*exec_req));
+               memset(exec_req, 0, sizeof(exec_req));
+               exec_req->request_type = local; 
+               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->request_id = exec_req->input_request->request_id;
+               forb_exec_req_ins_tail(forb_object_get_executor(exec_req->obj), exec_req);
+               return;
+       }
+
        ret = forb_iop_prepend_message_header(&req->cdr_request, forb_iop_REQUEST);
        if (!ret) {
                /* This should never happen */
index 1b1d0fc9c1fa39b4931ee573f2027160c7b74154..16f9049ed4d4c8f8adf0b837dfe80acaf3712d73 100644 (file)
@@ -66,7 +66,6 @@
 #include <forb/forb-internal.h>
 
 
-
 /**
  * Helper structure for sending ORB requests.
  *
index 896c2d9a1f1db4a91f17d8b37748a03521854081..981145f9c719baf0e440560d60d239085173eef8 100644 (file)
@@ -8,6 +8,7 @@
 #include <forb/iop.h>
 #include <forb/cdr.h>
 #include <forb/object.h>
+#include <semaphore.h>
 
 #include "myinterface.h"
 
 CORBA_long myinterface_add(myinterface _obj, const CORBA_long a, const CORBA_long b, CORBA_Environment *ev)
 {
   CORBA_long _forb_retval;
-  executor *exec_current;
+  forb_executor_t *exec_current;
   if (ev) ev->major = FORB_EX_NONE;
   /* local object */
-  if (forb_object_is_local(_obj)) {
+  if (forb_object_is_local(_obj) && !forb_get_current_executor(exec_current) && 
+                       (forb_object_get_executor(_obj) == exec_current)) {
     if (!_obj->interface ||
         strncmp(_obj->interface->name, "myinterface", 11) != 0) {
       ev->major = FORB_EX_BAD_OPERATION;
       return _forb_retval;
     }
-    if (!forb_get_current_executor(exec_current) && (forb_object_get_executor(_obj) == exec_current))
-      /* direct invocation */
-      _forb_retval = _myinterface_impl(_obj)->add(_obj, a, b, ev);
-    } else {
-      /* TODO inter-thread invocation*/
-    }
+    /* direct invocation */
+    _forb_retval = _myinterface_impl(_obj)->add(_obj, a, b, ev);
   } else {
     /* remote object - the same as before */
     forb_request_t req;