]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Improved reference counting of peer structures
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 20 Jan 2009 10:33:03 +0000 (11:33 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 20 Jan 2009 11:39:12 +0000 (12:39 +0100)
src/iop.c
src/peer.c
src/peer.h

index 262b9507f0e366e549177997b67ea4a8d8db13dd..d7d3a5326d35910b51cf59e42569e29074e9d769 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -412,11 +412,9 @@ process_hello(forb_port_t *port, FORB_CDR_Codec *codec)
                                if (notify_waiters) {
                                        fosa_cond_broadcast(&peer->cond);
                                } else {
-                                       forb_peer_get(peer);
-                                       forb_peer_nolock_insert(forb, peer);
+                                       forb_peer_nolock_insert(forb, forb_peer_get(peer));
                                }
-                               forb_peer_get(peer);
-                               forb_port_peer_ins_tail(port, peer);
+                               forb_port_peer_ins_tail(port, forb_peer_get(peer));
                                fosa_mutex_unlock(&forb->peer_mutex);
                                forb_peer_put(peer);
                        }
index 8384ef66c9bfd04dd265cb0fb0b3dcf42bc46365..ea04410790dcd6e7a59ec3cc12ae496ad93f8a33 100644 (file)
@@ -123,21 +123,21 @@ forb_peer_find_timed(forb_t *forb, forb_server_id *server_id,
                     fosa_abs_time_t *timeout)
 {
        forb_peer_t *peer;
+       bool peer_allocated = false;
        
        fosa_mutex_lock(&forb->peer_mutex);
        peer = forb_peer_nolock_find(forb, server_id);
        if (!peer && !timeout) goto unlock;
        if (peer) {
                forb_peer_get(peer);
-       }
-       if (!peer) {
+       } else {
                /* We are the first who want to contact this peer */
                peer = forb_peer_new();
                if (!peer) goto unlock;
                peer->server_id = *server_id;
                peer->state = FORB_PEER_WANTED;
-               forb_peer_get(peer);
-               forb_peer_nolock_insert(forb, peer);
+               forb_peer_nolock_insert(forb, forb_peer_get(peer));
+               peer_allocated = true;
        }
        while (peer->state == FORB_PEER_WANTED) {
                int ret;
@@ -146,11 +146,13 @@ forb_peer_find_timed(forb_t *forb, forb_server_id *server_id,
                                          &forb->peer_mutex,
                                          timeout);
                if (ret == FOSA_ETIMEDOUT) {
+                       /* No peer discovered within timeout */
+                       if (peer_allocated) {
+                               forb_peer_nolock_delete(forb, peer);
+                               forb_peer_put(peer);
+                       }
                        forb_peer_put(peer);
                        peer = NULL;
-                       /* TODO: How to remove the peer from the tree?
-                        * We should check refcnt and if equal to 1,
-                        * we should remove it.  */
                        break;
                }
        }
index 778eb24ada5fd22c6553ea7dd35dea7a06758bb5..caa30eb9e31c62f0aa45829932953a2199a0007f 100644 (file)
@@ -114,10 +114,11 @@ forb_peer_new(void);
 void
 forb_peer_release(forb_ref_t *ref);
 
-static inline void
+static inline forb_peer_t *
 forb_peer_get(forb_peer_t *peer)
 {
        forb_ref_get(&peer->ref);
+       return peer;
 }
        
 static inline void