]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/proto_inet.c
forb: Fix incorrect parameter of forb_peer_put()
[frescor/forb.git] / src / proto_inet.c
index 94296c1535d6ce050bedb943ca7873f5e3571bd3..e1771d11610c1b290acda68888a1842a1ce080ea 100644 (file)
@@ -61,6 +61,7 @@
 #include <forb/config.h>
 #include "discovery.h"
 #include <stdlib.h>
+#include <netinet/tcp.h>
 #include "iop.h" /* FIXME: Sending hello should be handled in IOP layer */
 
 /**
@@ -147,7 +148,23 @@ inet_deserialize_addr(FORB_CDR_Codec *codec, void **addr)
        return ret;
 }
 
-int setnonblocking(int fd);
+static int
+setnonblocking(int fd);
+
+static int
+setnodelay(int fd)
+{
+       int ret = 0;
+#if 0                          /* For nice graphs in benchmarks */
+       int yes = 1;
+       ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
+       if (ret < 0) {
+               ul_logerr("setsockopt(TCP_NODELAY): %s\n", strerror(errno));
+       }
+#endif
+       return ret;
+       
+}
 
 static int
 inet_connect(forb_peer_t *peer)
@@ -172,7 +189,7 @@ inet_connect(forb_peer_t *peer)
        sa.sin_family = AF_INET;
        sa.sin_port = addr->port;
        sa.sin_addr = addr->addr;
-       ul_logdeb("connect to %s:%u\n", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
+       ul_logtrash("connect to %s:%u\n", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
        ret = connect(ipeer->socket, (struct sockaddr*)&sa, sizeof(sa));
        if (ret) {
                ul_logerr("connect error: %s\n", strerror(errno));
@@ -180,6 +197,7 @@ inet_connect(forb_peer_t *peer)
        }
 
        setnonblocking(ipeer->socket);
+       setnodelay(ipeer->socket);
 
        struct epoll_event ev;
        struct inet_port *p = peer->port->desc.proto_priv;
@@ -226,7 +244,7 @@ inet_send(forb_peer_t *peer, const void *buf, size_t len)
        }
 
        sent = 0;
-       ul_logdeb("send fd=%d len=%d\n", ipeer->socket, len);
+       ul_logtrash("send fd=%d len=%zu\n", ipeer->socket, len);
        do {
                ret = send(ipeer->socket, buf, len, 0);
                if (ret < 0) {
@@ -288,6 +306,7 @@ inet_accept_connection(forb_port_t *port)
                close(client);
                return -1;
        }
+       setnodelay(client);
 
        peer = forb_peer_new();
        if (peer) {
@@ -347,7 +366,8 @@ inet_recv(forb_port_t *port, void *buf, size_t len)
                        if (ipeer->socket == iport->last_recv_fd) {
                                inet_port_new_peer_delete(iport, peer);
 
-                               if (port->new_peer) forb_peer_put(peer);
+                               if (port->new_peer)
+                                       forb_peer_put(port->new_peer);
 
                                /* Let the upper layer assign forb ID
                                 * to this peer according to the request*/
@@ -375,7 +395,7 @@ inet_recv(forb_port_t *port, void *buf, size_t len)
                                forb_peer_put(peer);
                                port->new_peer = NULL;
                        }
-                       ul_logdeb("recv fd=%d disconnect\n", iport->last_recv_fd);
+                       ul_logtrash("recv fd=%d disconnect\n", iport->last_recv_fd);
                        ul_list_for_each(forb_port_peer, port, peer) {
                                struct inet_peer *ipeer = peer->proto_priv;
                                if (ipeer && ipeer->socket == iport->last_recv_fd) {
@@ -386,7 +406,7 @@ inet_recv(forb_port_t *port, void *buf, size_t len)
                        iport->last_recv_fd = -1;
                        continue;
                }
-               ul_logdeb("recv fd=%d len=%d\n", iport->last_recv_fd, ret);
+               ul_logtrash("recv fd=%d len=%zd\n", iport->last_recv_fd, ret);
                return ret;
        }
 #else
@@ -398,13 +418,18 @@ static int
 inet_port_destroy(forb_port_t * port)
 {
        struct inet_port *pd = port->desc.proto_priv;
+       forb_peer_t *peer;
        close(pd->epoll_fd);
        close(pd->udp_socket);
        close(pd->listen_socket);
+       ul_list_for_each_cut(inet_port_new_peer, pd, peer) {
+               forb_peer_put(peer);
+       }
        forb_free(pd);
        return 0;
 }
 
+#ifndef CONFIG_FORB_PROTO_INET_DEFAULT
 static ssize_t
 inet_broadcast(forb_port_t *port, const void *buf, size_t len)
 {
@@ -420,6 +445,7 @@ inet_broadcast(forb_port_t *port, const void *buf, size_t len)
                     (struct sockaddr*)&addr, sizeof(addr));
        return ret;
 }
+#endif
 
 static void
 inet_peer_destroy(forb_peer_t *peer)
@@ -427,7 +453,8 @@ inet_peer_destroy(forb_peer_t *peer)
        struct inet_peer *ipeer = peer->proto_priv;
        if (ipeer) {
                peer->proto_priv = NULL;
-               ul_logdeb("destroying peer fd=%d\n", ipeer->socket);
+               ul_logtrash("destroying peer fd=%d (orb_id=%s)\n",
+                           ipeer->socket, peer->orb_id);
                close(ipeer->socket);
                free(ipeer);
        }
@@ -471,7 +498,9 @@ static const forb_proto_t proto_inet = {
        .peer_destroy = inet_peer_destroy,
        .send = inet_send,
        .recv = inet_recv,
+#ifndef CONFIG_FORB_PROTO_INET_DEFAULT
        .broadcast = inet_broadcast,
+#endif
        .serialize_addr = inet_serialize_addr,
        .deserialize_addr = inet_deserialize_addr,
        .addr2str = inet_addr2str,