-#define _GNU_SOURCE
+#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_unlock(&s->mutex);
}
+bool check_sync_flag(struct sync_flag *s) {
+ bool flag;
+ pthread_mutex_lock(&s->mutex);
+ flag = s->flag;
+ pthread_mutex_unlock(&s->mutex);
+ return flag;
+}
+
bool wait_sync_flag(struct sync_flag *s, int seconds) {
struct timespec timeout;
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += seconds;
- while(!s->flag)
+ pthread_mutex_lock(&s->mutex);
+
+ while(!s->flag) {
if(!pthread_cond_timedwait(&s->cond, &s->mutex, &timeout) || errno != EINTR) {
break;
}
+ }
+
+ pthread_mutex_unlock(&s->mutex);
return s->flag;
}
+void link_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b) {
+ // Import and export both side's data
+
+ meshlink_add_address(a, "localhost");
+ meshlink_add_address(b, "localhost");
+
+ char *data = meshlink_export(a);
+ assert(data);
+ assert(meshlink_import(b, data));
+ free(data);
+
+ data = meshlink_export(b);
+ assert(data);
+ assert(meshlink_import(a, data));
+ free(data);
+}
+
void open_meshlink_pair(meshlink_handle_t **pa, meshlink_handle_t **pb, const char *prefix) {
// Create two new MeshLink instances
*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);
meshlink_enable_discovery(a, false);
meshlink_enable_discovery(b, false);
- // Import and export both side's data
-
- meshlink_add_address(a, "localhost");
-
- char *data = meshlink_export(a);
- assert(data);
- assert(meshlink_import(b, data));
- free(data);
-
- data = meshlink_export(b);
- assert(data);
- assert(meshlink_import(a, data));
- free(data);
+ link_meshlink_pair(a, b);
*pa = a;
*pb = b;
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;
}
}
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));
}