]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Fixed destroying of ports
authorMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 12 Oct 2008 07:42:19 +0000 (09:42 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 12 Oct 2008 07:42:19 +0000 (09:42 +0200)
Now, there is no problem with traversing the forb's peer tree and deleting
the peers belonging to a particular port. Peers are added to port's list,
so during port destroying we only traverse this list and remove remove the
peers found there from forb's tree.

TODO
src/Makefile.omk
src/iop.c
src/peer.c
src/peer.h
src/port.c
src/port.h

diff --git a/TODO b/TODO
index 4ef62dadd5011e052430bd15f10b6b5a65d0a4c5..bf1e9f9d958b78cb60ab2cfcb731c5ac1ebb4322 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,9 +1,12 @@
-* Create list for peers by port, so it will not be necessary to
-   traverse the peer tree when destroying ports.
-
 * Add forb_init() parameters: argc, argv and orb_id
 
 * More flexible handling of log messages (dynamic registration,
    parsing of command line parameters).
 
 * Error checking of deserialization in skeletons
+
+* Add FNA as transport protocol (probably with some reliable protocol
+   on top of FNA)
+
+* Add routing layer
+   
index 80eed2d4c3c6c88cec9182a18a05eb1c3262760b..34d42e325e1063cd6ebb5d2d877e4af5e8e0bd3f 100644 (file)
@@ -49,7 +49,7 @@ log_domains.inc:
        $(Q)$(SOURCES_DIR)/ul_log_domains $(SOURCES_DIR) > $@
 
 clean-custom:
-       $(Q)rm log_domains.inc
+       -$(Q)rm log_domains.inc
 
 # request_gavl.inc: $(SOURCES_DIR)/request_gavl.c
 #      @echo "  CPP     $@"
index df48cae4237220f8fffbfc382f0bbfc4ceb9df11..61f6d8468f1587bef867293f1a3daada9cfed345 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -60,6 +60,7 @@
 #include <ul_log.h>
 #include "exec_req.h"
 #include <errno.h>
+#include "peer.h"
 
 /** Version of the protocol */
 #define VER_MAJOR 0
@@ -408,6 +409,8 @@ process_hello(forb_port_t *port, CDR_Codec *codec)
                                        forb_peer_get(peer);
                                        forb_peer_nolock_insert(forb, peer);
                                }
+                               forb_peer_get(peer);
+                               forb_port_peer_ins_tail(port, peer);
                                fosa_mutex_unlock(&forb->peer_mutex);
                                forb_peer_put(peer);
                        }
index 321e729c53c07a3f5472bbf729167311a1518ec6..bb2db1baa37aa494e2d98002ff4ce4a725a8ebb8 100644 (file)
@@ -53,7 +53,7 @@ GAVL_CUST_NODE_INT_IMP(forb_peer_nolock,/* cust_prefix */
                       forb_peer_t,     /* cust_item_t */
                       forb_server_id,  /* cust_key_t */
                       peers,           /* cust_root_node */
-                      node,            /* cust_item_node */
+                      gnode,           /* cust_item_node */
                       server_id,       /* cust_item_key */
                       forb_server_id_cmp);/* cust_cmp_fnc */
 
@@ -87,17 +87,10 @@ void
 forb_peer_delete_by_port(forb_t *forb, forb_port_t *port)
 {
        forb_peer_t *peer;
-       fosa_mutex_lock(&port->forb->peer_mutex);
-       /* FIXME: Is gavl_cust_for_each() deletion safe? What about
-        * recursive locking of mutex. */
-#warning Delete during GAVL traversal is probably not correct.
-       gavl_cust_for_each(forb_peer_nolock, forb, peer) {
-               if (peer->port == port) {
-                       forb_peer_nolock_delete(forb, peer);
-                       forb_peer_put(peer);
-               }
+       ul_list_for_each_cut(forb_port_peer, port, peer) {
+               forb_peer_delete(forb, peer);
+               forb_peer_put(peer);
        }
-       fosa_mutex_unlock(&port->forb->peer_mutex);
 }
 
 forb_peer_t *
index d0a51869ed4c74d8cd85fc4e652274d31442655a..09b90665e223bd65b7b67cc2eb4a02afdee86918 100644 (file)
@@ -50,6 +50,8 @@
 #include <forb/forb-internal.h>
 #include "port.h"
 #include "refcnt.h"
+#include <ul_gavl.h>
+#include <ul_list.h>
 
 enum forb_peer_state {
        FORB_PEER_WANTED,       /**< Somebody is waiting for the peer to be discovered. In this state, only @a server_id field is set. */
@@ -69,7 +71,8 @@ enum forb_peer_state {
         forb_port_t *port;     /**< Port of this peer is connected to */
         void *addr;            /**< Protocol specific address of the peer. */
         void *proto_priv;      /**< Protocol private data (e.g. info about established connection) */
-        gavl_node_t node;      /**< Node of port's peers tree */
+        gavl_node_t gnode;     /**< Node of forb's peers tree */
+        ul_list_node_t lnode;  /**< Node of port's peer list */
         forb_ref_t ref;        /**< Reference count */
         enum forb_peer_state state;
         fosa_cond_t cond;      /**< Condition variable for waiting after the peer is discovered. Used together with forb::peer_mutex. */
@@ -82,10 +85,16 @@ GAVL_CUST_NODE_INT_DEC(forb_peer_nolock,/* cust_prefix */
                       forb_peer_t,     /* cust_item_t */
                       forb_server_id,  /* cust_key_t */
                       peers,           /* cust_root_node */
-                      node,            /* cust_item_node */
+                      gnode,           /* cust_item_node */
                       server_id,       /* cust_item_key */
                       forb_server_id_cmp)/* cust_cmp_fnc */
 
+UL_LIST_CUST_DEC(forb_port_peer, /* cust_prefix */
+                forb_port_t,    /* cust_head_t */
+                forb_peer_t,    /* cust_item_t */
+                peers,          /* cust_head_field */
+                lnode)          /* cust_node_field */
+
 forb_peer_t *
 forb_peer_new(void);
 
index fd79aa8f9085aaf29befb56b9b757919c53649b5..de4e2eeb2d3140304c24ec66a33de8d7e84ee431 100644 (file)
@@ -70,6 +70,8 @@ int forb_register_port(forb_t *forb, forb_port_t *port)
        
        port->forb = forb;
        port->finish = false;
+
+       forb_port_peer_init_head(port);
        
        fosa_mutex_lock(&forb->port_mutex);
        forb_port_insert(forb, port);
@@ -138,6 +140,8 @@ void forb_destroy_port(forb_port_t *port)
                port->proto->port_destroy(port);
        }
 
+       /* Because of no locking of port->peers, this must be called
+        * after receiver thread is stopped. */
        forb_peer_delete_by_port(forb, port);
 
        CDR_codec_release_buffer(&port->codec);
index f9093273191b3cca0168444543b5cb650cc815bc..36f5e7e32e2d84958f0916074d8e95b48f93cf7e 100644 (file)
@@ -67,7 +67,7 @@ struct forb_port {
        CDR_Codec codec;                  /**< Receiving buffer for receiver thread */
        void *addr;                       /**< Port's address in a protocol specific format. */
        ul_list_node_t node;              /**< Node in forb's port list */
-       gavl_cust_root_field_t peers;     /**< Peers discovered on this port by discovery protocol */
+       ul_list_head_t peers;             /**< Peers discovered on this port by discovery protocol */
        bool finish;                      /**< True when the threads should finish their execution, false otherwise. */
 };