You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ad...@apache.org on 2017/04/19 18:18:07 UTC

[11/30] incubator-mynewt-core git commit: inet_def_service; fix race when connection is closing.

inet_def_service; fix race when connection is closing.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/e120cfc3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/e120cfc3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/e120cfc3

Branch: refs/heads/master
Commit: e120cfc316d7181fdd24e0b7d9da95ad7bf8a7cd
Parents: 73a3202
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Fri Apr 14 12:46:33 2017 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Fri Apr 14 13:21:30 2017 -0700

----------------------------------------------------------------------
 net/ip/inet_def_service/src/inet_def_service.c | 110 ++------------------
 1 file changed, 6 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e120cfc3/net/ip/inet_def_service/src/inet_def_service.c
----------------------------------------------------------------------
diff --git a/net/ip/inet_def_service/src/inet_def_service.c b/net/ip/inet_def_service/src/inet_def_service.c
index 3bbe59e..ff688da 100644
--- a/net/ip/inet_def_service/src/inet_def_service.c
+++ b/net/ip/inet_def_service/src/inet_def_service.c
@@ -106,7 +106,7 @@ inet_def_tcp_readable(void *arg, int err)
 {
     struct inet_def_tcp *idt = (struct inet_def_tcp *)arg;
 
-    if (err) {
+    if (err && !idt->closed) {
         idt->closed = 1;
         /*
          * No locking here. Assuming new connection notifications, as well as
@@ -241,7 +241,11 @@ inet_def_event(struct os_event *ev)
     case INET_DEF_ECHO:
         while (mn_recvfrom(sock, &m, (struct mn_sockaddr *)&msin) == 0) {
             console_printf("echo %d bytes\n", OS_MBUF_PKTLEN(m));
-            rc = mn_sendto(sock, m, (struct mn_sockaddr *)&msin);
+            if ((int)ev->ev_arg == MN_SOCK_DGRAM) {
+                rc = mn_sendto(sock, m, (struct mn_sockaddr *)&msin);
+            } else {
+                rc = mn_sendto(sock, m, NULL);
+            }
             if (rc) {
                 console_printf("  failed: %d!!!!\n", rc);
                 os_mbuf_free_chain(m);
@@ -308,108 +312,6 @@ inet_def_event(struct os_event *ev)
     }
 }
 
-#if 0
-static void
-inet_def_srv(void *arg)
-{
-    struct inet_def_udp *idu;
-    struct inet_def_tcp *idt;
-    struct mn_socket *sock;
-    struct os_event *ev;
-    struct mn_sockaddr_in msin;
-    struct os_mbuf *m;
-    enum inet_def_type type;
-    int rc;
-    int off;
-    int loop_cnt;
-
-    while (1) {
-        /*
-         * Wait here. When event comes, check what type of socket got it,
-         * and then act on it.
-         */
-        ev = os_eventq_get(inet_def_evq);
-        type = ev->ev_type;
-        idt = (struct inet_def_tcp *)ev;
-        idu = (struct inet_def_udp *)ev;
-        if ((int)ev->ev_arg == MN_SOCK_DGRAM) {
-            sock = idu->socket;
-        } else {
-            sock = idt->socket;
-        }
-        switch (type) {
-        case INET_DEF_ECHO:
-            while (mn_recvfrom(sock, &m, (struct mn_sockaddr *)&msin) == 0) {
-                console_printf("echo %d bytes\n", OS_MBUF_PKTLEN(m));
-                rc = mn_sendto(sock, m, (struct mn_sockaddr *)&msin);
-                if (rc) {
-                    console_printf("  failed: %d!!!!\n", rc);
-                    os_mbuf_free_chain(m);
-                }
-            }
-            break;
-        case INET_DEF_DISCARD:
-            while (mn_recvfrom(sock, &m, NULL) == 0) {
-                console_printf("discard %d bytes\n", OS_MBUF_PKTLEN(m));
-                os_mbuf_free_chain(m);
-            }
-            break;
-        case INET_DEF_CHARGEN:
-            while (mn_recvfrom(sock, &m, NULL) == 0) {
-                os_mbuf_free_chain(m);
-            }
-            if ((int)ev->ev_arg == MN_SOCK_STREAM && idt->closed) {
-                /*
-                 * Don't try to send tons of data to a closed socket.
-                 */
-                break;
-            }
-            loop_cnt = 0;
-            do {
-                m = os_msys_get(CHARGEN_WRITE_SZ, 0);
-                if (m) {
-                    for (off = 0;
-                         OS_MBUF_TRAILINGSPACE(m) >= CHARGEN_PATTERN_SZ;
-                         off += CHARGEN_PATTERN_SZ) {
-                        os_mbuf_copyinto(m, off, chargen_pattern,
-                          CHARGEN_PATTERN_SZ);
-                    }
-                    console_printf("chargen %d bytes\n", m->om_len);
-                    rc = mn_sendto(sock, m, NULL); /* assumes TCP for now */
-                    if (rc) {
-                        os_mbuf_free_chain(m);
-                        if (rc != MN_ENOBUFS && rc != MN_EAGAIN) {
-                            console_write("  sendto fail!!! %d\n", rc);
-                        }
-                        break;
-                    }
-                } else {
-                    /*
-                     * Mbuf shortage. Wait for them to appear.
-                     */
-                    os_time_delay(1);
-                }
-                loop_cnt++;
-            } while (loop_cnt < 32);
-            break;
-        default:
-            assert(0);
-            break;
-        }
-        if ((int)ev->ev_arg == MN_SOCK_STREAM && idt->closed) {
-            /*
-             * Remote end has closed the connection, as indicated in the
-             * callback. Close the socket and free the memory.
-             */
-            mn_socket_set_cbs(idt->socket, NULL, NULL);
-            os_eventq_remove(&inet_def_evq, &idt->ev);
-            mn_close(idt->socket);
-            os_free(idt);
-        }
-    }
-}
-#endif
-
 void
 inet_def_service_init(struct os_eventq *evq)
 {