]> git.meshlink.io Git - meshlink/blobdiff - test/utils.c
Remove extra locks causing deadlocks for wait_sync_flag function
[meshlink] / test / utils.c
index d7505ced77f4f8e8d513f591405e1fece2e12578..a2b7b143972991d824ad23b9922860172f279921 100644 (file)
@@ -1,4 +1,4 @@
-#define _GNU_SOURCE
+#define _GNU_SOURCE 1
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -8,9 +8,9 @@
 
 #include "utils.h"
 
-void set_sync_flag(struct sync_flag *s) {
+void set_sync_flag(struct sync_flag *s, bool value) {
        pthread_mutex_lock(&s->mutex);
-       s->flag = true;
+       s->flag = value;
        pthread_cond_broadcast(&s->cond);
        pthread_mutex_unlock(&s->mutex);
 }
@@ -20,9 +20,14 @@ bool wait_sync_flag(struct sync_flag *s, int seconds) {
        clock_gettime(CLOCK_REALTIME, &timeout);
        timeout.tv_sec += seconds;
 
+       pthread_mutex_lock(&s->mutex);
+
        while(!s->flag)
-               if(!pthread_cond_timedwait(&s->cond, &s->mutex, &timeout) || errno != EINTR)
+               if(!pthread_cond_timedwait(&s->cond, &s->mutex, &timeout) || errno != EINTR) {
                        break;
+               }
+
+       pthread_mutex_unlock(&s->mutex);
 
        return s->flag;
 }
@@ -33,11 +38,13 @@ void open_meshlink_pair(meshlink_handle_t **pa, meshlink_handle_t **pb, const ch
        *pa = *pb = NULL;
 
        char *a_name, *b_name;
+       int ret_val;
+       (void)ret_val;
 
-       asprintf(&a_name, "%s_conf.1", prefix);
+       ret_val = asprintf(&a_name, "%s_conf.1", prefix);
        assert(a_name);
 
-       asprintf(&b_name, "%s_conf.2", prefix);
+       ret_val = asprintf(&b_name, "%s_conf.2", prefix);
        assert(b_name);
 
        meshlink_handle_t *a = meshlink_open(a_name, "a", prefix, DEV_CLASS_BACKBONE);
@@ -69,24 +76,22 @@ void open_meshlink_pair(meshlink_handle_t **pa, meshlink_handle_t **pb, const ch
 
 // Don't poll in the application thread, use a condition variable to signal when the peer is online.
 static void pair_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
-       set_sync_flag(mesh->priv);
+       (void)node;
+
+       set_sync_flag(mesh->priv, reachable);
 }
 
 void start_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b) {
-       struct sync_flag pair_status = {};
+       struct sync_flag pair_status = {.flag = false};
 
        a->priv = &pair_status;
        meshlink_set_node_status_cb(a, pair_status_cb);
 
-       pthread_mutex_lock(&pair_status.mutex);
-
        meshlink_start(a);
        meshlink_start(b);
 
        assert(wait_sync_flag(&pair_status, 5));
 
-       pthread_mutex_unlock(&pair_status.mutex);
-
        meshlink_set_node_status_cb(a, NULL);
        a->priv = NULL;
 }
@@ -97,17 +102,19 @@ void stop_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b) {
 }
 
 void close_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b, const char *prefix) {
+       int ret_val;
+       (void)ret_val;
        meshlink_close(a);
        meshlink_close(b);
 
        if(prefix) {
                char *a_name, *b_name;
 
-               asprintf(&a_name, "%s_conf.1", prefix);
+               ret_val = asprintf(&a_name, "%s_conf.1", prefix);
                assert(a_name);
                assert(meshlink_destroy(a_name));
 
-               asprintf(&b_name, "%s_conf.2", prefix);
+               ret_val = asprintf(&b_name, "%s_conf.2", prefix);
                assert(b_name);
                assert(meshlink_destroy(b_name));
        }