]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/iop.c
orb_id is propagated to peers
[frescor/forb.git] / src / iop.c
index 882490ad0e912664fbc9ceb96e466b07c4ac81d1..2c3cdb42a0a5d7c823d092c3fad81906fea0ab20 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -110,16 +110,18 @@ forb_iop_prepare_request(forb_request_t *req,
        return ret;
 }
 
-CORBA_boolean
+static CORBA_boolean
 forb_iop_prepare_hello(FORB_CDR_Codec *codec,
                       const forb_server_id *server_id,
                       const void *src_addr,
-                      CORBA_boolean (*serialize_addr)(FORB_CDR_Codec *codec, const void *addr))
+                      CORBA_boolean (*serialize_addr)(FORB_CDR_Codec *codec, const void *addr),
+                      const CORBA_string orb_id)
 {
        if (!forb_server_id_serialize(codec, server_id)) return CORBA_FALSE;
        if (serialize_addr) {
                if (!serialize_addr(codec, src_addr)) return CORBA_FALSE;
        }
+       if (!CORBA_string_serialize(codec, &orb_id)) return CORBA_FALSE;
        if (!forb_iop_prepend_message_header(codec, forb_iop_HELLO)) return CORBA_FALSE;
        return CORBA_TRUE;
 }
@@ -366,7 +368,8 @@ process_reply(forb_port_t *port, FORB_CDR_Codec *codec)
 }
 
 void new_peer_discovered(forb_port_t *port, forb_peer_t *peer,
-                        forb_server_id server_id, void *addr)
+                        forb_server_id server_id, void *addr,
+                        CORBA_string orb_id)
 {
        forb_t *forb = port->forb;
        bool notify_waiters = false;
@@ -382,6 +385,7 @@ void new_peer_discovered(forb_port_t *port, forb_peer_t *peer,
        peer->server_id = server_id;
        peer->port = port;
        peer->addr = addr;
+       peer->orb_id = orb_id;
        peer->state = FORB_PEER_DISCOVERED;
        if (notify_waiters) {
                fosa_cond_broadcast(&peer->cond);
@@ -392,7 +396,9 @@ void new_peer_discovered(forb_port_t *port, forb_peer_t *peer,
        fosa_mutex_unlock(&forb->peer_mutex);
        {
                char str[60];
-               ul_logdeb("new peer discovered %s\n", forb_server_id_to_string(str, &peer->server_id, sizeof(str)));
+               ul_logdeb("new peer discovered %s (orb_id '%s')\n",
+                         forb_server_id_to_string(str, &peer->server_id, sizeof(str)),
+                         orb_id);
        }
        forb_peer_put(peer);
 
@@ -418,6 +424,7 @@ process_hello(forb_port_t *port, FORB_CDR_Codec *codec)
        void *addr = NULL;
        forb_peer_t *peer;
        forb_t *forb = port->forb;
+       CORBA_string peer_orb_id = NULL;
 
 /*     printf("Hello received at port %p\n", port); */
 
@@ -429,15 +436,18 @@ process_hello(forb_port_t *port, FORB_CDR_Codec *codec)
        if (port->desc.proto->deserialize_addr) {
                port->desc.proto->deserialize_addr(codec, &addr);
        }
+       CORBA_string_deserialize(codec, &peer_orb_id);
        if (forb_server_id_cmp(&server_id, &forb->server_id) != 0) {
                peer = forb_peer_find(forb, &server_id);
                if (peer && peer->state == FORB_PEER_DISCOVERED) {
                        /* TODO: Update last hello receive time */
                        if (addr)
                                forb_free(addr);
+                       if (peer_orb_id)
+                               forb_free(peer_orb_id);
                        forb_peer_put(peer);
                } else {
-                       new_peer_discovered(port, peer, server_id, addr);
+                       new_peer_discovered(port, peer, server_id, addr, peer_orb_id);
                }
        }
 }
@@ -589,7 +599,7 @@ void *forb_iop_discovery_thread(void *arg)
 
                FORB_CDR_buffer_reset(&codec, forb_iop_MESSAGE_HEADER_SIZE);
                forb_iop_prepare_hello(&codec, &port->forb->server_id, port->desc.addr,
-                                      proto->serialize_addr);
+                                      proto->serialize_addr, port->forb->attr.orb_id);
 /*             printf("Broadcasting hello from port %p\n", port);  */
                proto->broadcast(port, &codec.buffer[codec.rptr],
                                 FORB_CDR_data_size(&codec));