]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/discovery.c
forb: Split forb_port_destroy() to stop and destroy phases
[frescor/forb.git] / src / discovery.c
index cc859906278e3215b93f83bbb5a684ca312de45c..ae2b88c5e558cca05e64d76b2898949a1657aee0 100644 (file)
@@ -56,6 +56,8 @@
 #include "discovery.h"
 #include <ul_log.h>
 #include "object.h"
+#include <forb/config.h>
+#include "iop.h"
 
 extern UL_LOG_CUST(ulogd_forb_discovery);
 
@@ -111,9 +113,9 @@ forb_peer_delete(forb_t *forb, forb_peer_t *peer)
  * @param forb 
  * @param server_id 
  * 
- * @return The found peer or NULL if no peer is found. You have to
- * call forb_peer_put() after you finish working with the non NULL
- * retuned value.
+ * @return The found peer or NULL if no peer is found. forb_peer_put()
+ * has to be called on the non-NULL returned value after is not
+ * needed.
  */
 forb_peer_t *
 forb_peer_find(forb_t *forb, forb_server_id *server_id)
@@ -231,6 +233,18 @@ void forb_new_peer_discovered(forb_port_t *port, forb_peer_t *peer,
                          forb_server_id_to_string(str, &peer->server_id, sizeof(str)),
                          orb_id);
        }
+#ifdef CONFIG_FORB_PROTO_INET_DEFAULT
+       if (forb->attr.redistribute_hellos) {
+               forb_peer_t *p;
+               ul_list_for_each(forb_port_peer, port, p) {
+                       if (p != peer &&
+                           forb_server_id_cmp(&p->server_id, &forb->server_id) != 0) {
+                               forb_iop_redistribute_hello_to(p, peer); /* Introduce new peer to others */
+                               forb_iop_redistribute_hello_to(peer, p); /* Introduce other peers to the new one */
+                       }
+               }
+       }
+#endif
        if (forb->attr.peer_discovery_callback) {
                forb_orb peer_orb = forb_object_new(forb->orb, &peer->server_id, 0);
                forb->attr.peer_discovery_callback(peer_orb, orb_id);
@@ -254,6 +268,9 @@ void forb_peer_disconnected(forb_peer_t *peer)
 {
        forb_peer_delete(peer->port->forb, peer);
        forb_port_peer_delete(peer->port, peer);
-       forb_peer_put(peer);    /* This should release the peer and in case on proto_inet close the socker. */
+
+       /* This should release the peer and in case on proto_inet
+        * close the socket. */
+       forb_peer_put(peer);
 }