]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Completed implementation of executors
authorMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 5 Oct 2008 20:52:41 +0000 (22:52 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 5 Oct 2008 20:52:41 +0000 (22:52 +0200)
Still not tested

cdr.h
iop.c
request.c

diff --git a/cdr.h b/cdr.h
index 2feede685b1f312f8e5d1bf88580c004031e8f21..142ff1ac1b9223409779c1920171e15cb8ddac41 100644 (file)
--- a/cdr.h
+++ b/cdr.h
  *                      http://dce.felk.cvut.cz                       
  *                      http://www.ocera.org                          
  *                                                                    
- *  Author:             Petr Smolik    petr.smolik@wo.cz             
+ *  Author:             Petr Smolik    petr.smolik@wo.cz
  *  Advisor:            Pavel Pisa                                   
- *  Project Responsible: Zdenek Hanzalek                              
+ *  Project Responsible: Zdenek Hanzalek
+ *  
+ *  Modified for FORB by Michal Sojka <sojkam1@fel.cvut.cz>, 2008
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
diff --git a/iop.c b/iop.c
index ee4485eb7c8204db44ffa2452ddf20e44f49e559..920503e597634fef936e7657ac49b80daeea5b19 100644 (file)
--- a/iop.c
+++ b/iop.c
@@ -150,13 +150,14 @@ forb_iop_send_reply(forb_t *forb,
                goto err;
        }
        forb_proto_send(peer, codec);
-err:
        forb_peer_put(peer);
+err:
+       ;
 }
 
 
 static void
-process_request(forb_port_t *port, CDR_Codec *codec)
+process_request(forb_port_t *port, CDR_Codec *codec, uint32_t message_size)
 {
        forb_iop_request_header request_header;
        CORBA_boolean ret;
@@ -166,13 +167,22 @@ process_request(forb_port_t *port, CDR_Codec *codec)
        struct forb_env env;
        CDR_Codec reply_codec;
        forb_exec_req_t *exec_req;
-               
+       uint32_t req_size, data_size, header_size;
+
+       data_size = CDR_data_size(codec);
        ret = forb_iop_request_header_deserialize(codec, &request_header);
        if (!ret) {
                ul_logerr("Malformed request recevied\n");
                env.major = FORB_EX_COMM_FAILURE;
                goto out;
-       } 
+       }
+       header_size = data_size - CDR_data_size(codec);
+       req_size = message_size - header_size;
+
+       ul_logdeb("rcvd request: id=%u, iface=%s, method=%hd\n",
+                 request_header.request_id,
+                 request_header.iface,
+                 request_header.method_index);
        
        obj = forb_key_to_object(forb, request_header.objkey);
        if (!obj) {
@@ -207,8 +217,20 @@ process_request(forb_port_t *port, CDR_Codec *codec)
                exec_req->source = request_header.source;
                exec_req->obj = obj;
                exec_req->method_index = request_header.method_index;
-               #warning TODO
-               /* exec_req->codec = ....; */
+               /* Copy the request to exec_req */
+               CDR_codec_init_static(&exec_req->codec);
+               ret = CDR_buffer_init(&exec_req->codec,
+                                     req_size,
+                                     0);
+               if (!ret) {
+                       env.major = FORB_EX_NO_MEMORY;
+                       ul_logerr("No memory for executor request bufer\n");
+                       goto send_execption;
+               }
+               exec_req->codec.data_endian = codec->data_endian;
+               CDR_buffer_gets(codec, exec_req->codec.buffer, req_size);
+               /* TODO: Use better data structure for incomming
+                  buffer to achieve zero-copy behaviour. */
                forb_exec_req_ins_tail(obj->executor, exec_req);
        } else {
                env.major = FORB_EX_NO_MEMORY;
@@ -239,7 +261,7 @@ process_reply(forb_port_t *port, CDR_Codec *codec)
        forb_iop_reply_header rh;
        forb_t *forb = port->forb;
        forb_request_t *req;
-       
+
        forb_iop_reply_header_deserialize(codec, &rh);
        req = forb_request_find(forb, &rh.request_id);
        if (!req) {
@@ -282,6 +304,10 @@ process_hello(forb_port_t *port, CDR_Codec *codec)
 /*     printf("Hello received at port %p\n", port); */
 
        forb_server_id_deserialize(codec, &server_id);
+       {
+               char str[60];
+               ul_logdeb("rcvd hello from %s\n", forb_server_id_to_string(str, &server_id, sizeof(str)));
+       }
        if (port->proto->deserialize_addr) {
                port->proto->deserialize_addr(codec, &addr);
        }
@@ -310,8 +336,10 @@ process_hello(forb_port_t *port, CDR_Codec *codec)
 }
 
 static void
-process_message(forb_port_t *port, forb_iop_message_header *mh, CDR_Codec *codec)
+process_message(forb_port_t *port, const forb_iop_message_header *mh,
+               CDR_Codec *codec)
 {
+       CORBA_long data_size = CDR_data_size(codec);
        /* TODO: Check destination address, whether the message is for
         * us or should be routed. */
 
@@ -319,17 +347,20 @@ process_message(forb_port_t *port, forb_iop_message_header *mh, CDR_Codec *codec
         * the message according mh.message_size. */
        switch (mh->message_type) {
                case forb_iop_REQUEST:
-                       process_request(port, codec);
+                       process_request(port, codec, mh->message_size);
                        break;
                case forb_iop_REPLY:
-                       process_reply(port, codec);
+                 process_reply(port, codec);
                        break;
                case forb_iop_HELLO:
-                       process_hello(port, codec);
+                 process_hello(port, codec);
                        break;
                default:
                        break;
        }
+       if (CDR_data_size(codec) != data_size - mh->message_size) {
+               ul_logerr("Message handled incorrectly\n");
+       }
 }
 
 /** 
index 43a3e069472a30be025cd484409cf24dec5e2847..35bb825708b557a02b03b8b1455df5365db15944 100644 (file)
--- a/request.c
+++ b/request.c
@@ -123,7 +123,7 @@ forb_request_send(forb_request_t *req, CORBA_Environment *env)
        peer = forb_get_next_hop(forb, &req->obj->server);
        if (!peer) {
                char str[50];
-               ul_logerr("Cannot find peer for server: %s",
+               ul_logerr("Cannot find peer to send request to server: %s\n",
                          forb_server_id_to_string(str, &req->obj->server, sizeof(str)));
                env->major = FORB_EX_TRANSIENT;
                return;