]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/iop.c
forb: Objects must be properly reference-counted
[frescor/forb.git] / src / iop.c
index 248f94ab421b876374e8881a53cb288c6794e34f..6ba0ec3107796471f9272e20c36d43201acdb8d3 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -91,17 +91,16 @@ forb_iop_prepend_message_header(FORB_CDR_Codec *codec, forb_iop_message_type mt)
 
 CORBA_boolean
 forb_iop_prepare_request(forb_request_t *req,
-                        char *iface,
-                        unsigned method_ind,
+                        unsigned *index,
                         CORBA_Environment *env)
 {
        CORBA_boolean ret;
        forb_iop_request_header rh;
 
        rh.request_id = req->request_id;
-       rh.iface = iface;
+       rh.iface = req->interface;
        rh.objkey = forb_object_to_key(req->obj);
-       rh.method_index = method_ind;
+       rh.method_index = req->method_ind;
        rh.source = forb_object_to_forb(req->obj)->server_id;
        ret = forb_iop_request_header_serialize(&req->cdr_request, &rh);
        if (ret) {
@@ -110,8 +109,9 @@ forb_iop_prepare_request(forb_request_t *req,
                char str[50];
                ul_logdeb("preparing request: id=%d  dest=%s  iface=%s method=%d\n", req->request_id,
                          forb_server_id_to_string(str, &req->obj->server, sizeof(str)),
-                         iface, method_ind);
+                         rh.iface, rh.method_index);
        }
+       *index = req->cdr_request.wptr;
        return ret;
 }
 
@@ -388,7 +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_type = FORB_EXEC_REQ_REMOTE
                exec_req->request_id = request_header.request_id;
                exec_req->source = request_header.source;
                exec_req->obj = obj;
@@ -725,7 +725,7 @@ void *forb_iop_discovery_thread(void *arg)
  * @param env Environment for returning exceptions
  */
 void
-forb_request_send(forb_request_t *req, CORBA_Environment *env)
+forb_request_send(forb_request_t *req, unsigned index, CORBA_Environment *env)
 {
        CORBA_boolean ret;
        forb_peer_t *peer;
@@ -755,12 +755,15 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env)
        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->request_type = FORB_EXEC_REQ_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;
+               exec_req->obj = forb_object_duplicate(req->obj);
+               exec_req->method_index = req->method_ind;
+               exec_req->interface = req->interface;
+               req->cdr_request.rptr = index;
+               exec_req->codec = req->cdr_request;
+               req->cdr_request.release_buffer = CORBA_FALSE;
+               exec_req->request_id = req->request_id;
                forb_exec_req_ins_tail(forb_object_get_executor(exec_req->obj), exec_req);
                return;
        }