]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Merge branch 'discovery' into everbase
[meshlink] / src / meshlink.c
index 7781c4b36257f41089b53128de0445d0c6153cba..601f49da910e61eebe941ef7646bb479d60fb1cd 100644 (file)
@@ -47,6 +47,9 @@ typedef struct {
 #define MSG_NOSIGNAL 0
 #endif
 
+static pthread_mutex_t global_mutex;
+static bool discovery_started;
+
 __thread meshlink_errno_t meshlink_errno;
 
 //TODO: this can go away completely
@@ -872,8 +875,16 @@ bool meshlink_start(meshlink_handle_t *mesh) {
        mesh->threadstarted=true;
 
        // Start discovery
-       if(!discovery_start(mesh))
-               return false;
+       // Since only one Avahi instance can run in one program at the moment, make sure we only start one, ignore it otherwise.
+
+       bool discovery_on = false;
+       pthread_mutex_lock(&global_mutex);
+       if(!discovery_started)
+               discovery_on = discovery_started = true;
+       pthread_mutex_unlock(&global_mutex);
+
+       if(discovery_on)
+               discovery_start(mesh);
 
        return true;
 }
@@ -888,7 +899,14 @@ void meshlink_stop(meshlink_handle_t *mesh) {
        }
 
        // Stop discovery
+
+       bool discovery_on = mesh->discovery_threadstarted;
        discovery_stop(mesh);
+       if(discovery_on) {
+               pthread_mutex_lock(&global_mutex);
+               discovery_started = false;
+               pthread_mutex_unlock(&global_mutex);
+       }
 
        // Shut down a listening socket to signal the main thread to shut down
 
@@ -1707,7 +1725,6 @@ extern void meshlink_hint_address(meshlink_handle_t *mesh, meshlink_node_t *node
        append_config_file(mesh, node->name, "Address", full_addr_str);
 
 fail:
-done:
        free(addr_str);
        free(port_str);
        free(full_addr_str);