]> git.meshlink.io Git - meshlink/commitdiff
Make sure meshlink_stop() works as advertised.
authorGuus Sliepen <guus@meshlink.io>
Thu, 15 May 2014 15:53:54 +0000 (17:53 +0200)
committerGuus Sliepen <guus@meshlink.io>
Thu, 15 May 2014 15:53:54 +0000 (17:53 +0200)
At least on Linux, one way to signal a sleeping select() call in
the thread is to call shutdown() on the listening sockets. A subsequent
accept() returns EINVAL, we use that as a cue to shut down the main
loop.

src/meshlink.c
src/net_socket.c

index 2aa79def7d47c6762e01f30715cb14e277933991..bfadf61b320596304e925ee4e41a7c2d8319332e 100644 (file)
@@ -828,7 +828,12 @@ bool meshlink_start(meshlink_handle_t *mesh) {
 }
 
 void meshlink_stop(meshlink_handle_t *mesh) {
-       // TODO: close the listening sockets to signal the main thread to shut down
+       // Shut down the listening sockets to signal the main thread to shut down
+
+       for(int i = 0; i < mesh->listen_sockets; i++) {
+               shutdown(mesh->listen_socket[i].tcp.fd, SHUT_RDWR);
+               shutdown(mesh->listen_socket[i].udp.fd, SHUT_RDWR);
+       }
 
        // Wait for the main thread to finish
 
index c6fc124261101053ae3e756deb47ccb18b87a587..3cbc5dd634fa2d60d302daab5a0959b9c16d9b17 100644 (file)
@@ -545,6 +545,11 @@ void handle_new_meta_connection(event_loop_t *loop, void *data, int flags) {
        fd = accept(l->tcp.fd, &sa.sa, &len);
 
        if(fd < 0) {
+               if(errno == EINVAL) { // TODO: check if Windows agrees
+                       event_loop_stop(loop);
+                       return;
+               }
+
                logger(DEBUG_ALWAYS, LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno));
                return;
        }