]> git.meshlink.io Git - meshlink/commitdiff
Fix race condition when calling meshlink_stop() immediately after meshlink_start().
authorGuus Sliepen <guus@meshlink.io>
Fri, 13 Nov 2015 08:50:45 +0000 (08:50 +0000)
committerGuus Sliepen <guus@meshlink.io>
Sun, 25 Jun 2017 08:45:53 +0000 (10:45 +0200)
The event loop didn't react to event_loop_stop() if it wasn't started yet
(because that is done in mesh->thread). The solution is to add a
event_loop_start() function that is to be called by meshlink_start().

src/event.c
src/event.h
src/meshlink.c

index 5a131b64875bb7e2317b2e83fe40fb427b387fe6..1f6ea186330ccdad0ea034c18ff621fc63febb04 100644 (file)
@@ -183,8 +183,6 @@ void idle_set(event_loop_t *loop, idle_cb_t cb, void *data) {
 }
 
 bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex) {
-       loop->running = true;
-
        fd_set readable;
        fd_set writable;
 
@@ -266,6 +264,10 @@ void event_flush_output(event_loop_t *loop) {
                        io->cb(loop, io->data, IO_WRITE);
 }
 
+void event_loop_start(event_loop_t *loop) {
+       loop->running = true;
+}
+
 void event_loop_stop(event_loop_t *loop) {
        loop->running = false;
 }
index 0b664e178c395262840598cc9e5906fc102a8a18..02d1958352fe291ef5698aec0ac66ace0813fafe 100644 (file)
@@ -95,6 +95,7 @@ extern void event_loop_init(event_loop_t *loop);
 extern void event_loop_exit(event_loop_t *loop);
 extern bool event_loop_run(event_loop_t *loop, pthread_mutex_t *mutex);
 extern void event_loop_flush_output(event_loop_t *loop);
+extern void event_loop_start(event_loop_t *loop);
 extern void event_loop_stop(event_loop_t *loop);
 
 #endif
index 1c763d6a668e632a70650d648e259c9aedb66d88..b3b18074b171c9d93b3217fcbde533b7a4a80326 100644 (file)
@@ -965,6 +965,8 @@ bool meshlink_start(meshlink_handle_t *mesh) {
 
        // Start the main thread
 
+       event_loop_start(&mesh->loop);
+
        if(pthread_create(&mesh->thread, NULL, meshlink_main_loop, mesh) != 0) {
                logger(mesh, MESHLINK_DEBUG, "Could not start thread: %s\n", strerror(errno));
                memset(&mesh->thread, 0, sizeof mesh->thread);