]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Fixed port destroy
authorMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 2 Oct 2008 13:22:47 +0000 (15:22 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Thu, 2 Oct 2008 13:22:47 +0000 (15:22 +0200)
peer.c
peer.h
port.c
proto_unix.c

diff --git a/peer.c b/peer.c
index 1a2cfb1f3c37abbec83b5b60b3da73c9b1475ec7..250fb0c3344e5b0650d12473b738a8eeac2b65b5 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -34,3 +34,20 @@ forb_peer_release(forb_ref_t *ref)
        }
        forb_free(peer);
 }
+
+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);
+               }
+       }
+       fosa_mutex_unlock(&port->forb->peer_mutex);
+}
diff --git a/peer.h b/peer.h
index d0d878b41e0ecc9c5ad237bce298d18bb7e2ff39..1f76cfe14785b25d81ae3b163ead49d93d440141 100644 (file)
--- a/peer.h
+++ b/peer.h
@@ -70,6 +70,9 @@ forb_peer_delete(forb_t *forb, forb_peer_t *peer)
        fosa_mutex_unlock(&forb->peer_mutex);
 }
 
+void
+forb_peer_delete_by_port(forb_t *forb, forb_port_t *port);
+
 /** 
  * Finds peer with given @a server_id.
  * 
diff --git a/port.c b/port.c
index 62c240266f973f6f28cc6f0d3b7c0cb18629ee76..2af35769c0c2c1d1d85be38b1169f226c04328e1 100644 (file)
--- a/port.c
+++ b/port.c
@@ -57,7 +57,6 @@ err:
 
 void forb_destroy_port(forb_port_t *port)
 {
-       forb_peer_t *peer;
        forb_t *forb = port->forb;
        
        port->finish = true;    /* Exit all the threads */
@@ -73,16 +72,7 @@ void forb_destroy_port(forb_port_t *port)
                port->proto->port_destroy(port);
        }
 
-       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 problbly not correct.
-       gavl_cust_for_each(forb_peer_nolock, forb, peer) {
-               if (peer->port == port) {
-                       forb_peer_delete(forb, peer);
-               }
-       }
-       fosa_mutex_unlock(&port->forb->peer_mutex);
+       forb_peer_delete_by_port(forb, port);
 
        /* TODO: reference counting */
        forb_free(port);
index ed158e6869d8bf3cf7b7d1c245aca76d3465f8ed..d22466708c2834cca9e2473b695b0fdc50b99934 100644 (file)
@@ -134,6 +134,7 @@ forb_unix_port_init(forb_port_t *port, const forb_server_id *server)
        if (pd->socket == -1) goto err1;
 
        unix_server_to_addr(&pd->addr, server);
+       /* unlink(pd->addr.sun_path); */ /* TODO: What to do when the socket already exist? */
        ret = bind(pd->socket, (struct sockaddr*)&pd->addr, sizeof(pd->addr));
        if (ret == -1) goto err;