#include "utils.h"
+void init_sync_flag(struct sync_flag *s) {
+ assert(pthread_mutex_init(&s->mutex, NULL) == 0);
+ assert(pthread_cond_init(&s->cond, NULL) == 0);
+ s->flag = false;
+}
+
void set_sync_flag(struct sync_flag *s, bool value) {
- pthread_mutex_lock(&s->mutex);
+ assert(pthread_mutex_lock(&s->mutex) == 0);
s->flag = value;
- pthread_cond_broadcast(&s->cond);
- pthread_mutex_unlock(&s->mutex);
+ assert(pthread_cond_broadcast(&s->cond) == 0);
+ assert(pthread_mutex_unlock(&s->mutex) == 0);
+}
+
+void reset_sync_flag(struct sync_flag *s) {
+ assert(pthread_mutex_lock(&s->mutex) == 0);
+ s->flag = false;
+ assert(pthread_mutex_unlock(&s->mutex) == 0);
}
bool check_sync_flag(struct sync_flag *s) {
bool flag;
- pthread_mutex_lock(&s->mutex);
+ assert(pthread_mutex_lock(&s->mutex) == 0);
flag = s->flag;
- pthread_mutex_unlock(&s->mutex);
+ assert(pthread_mutex_unlock(&s->mutex) == 0);
return flag;
}
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += seconds;
- pthread_mutex_lock(&s->mutex);
+ assert(pthread_mutex_lock(&s->mutex) == 0);
while(!s->flag) {
if(!pthread_cond_timedwait(&s->cond, &s->mutex, &timeout) || errno != EINTR) {
}
}
- pthread_mutex_unlock(&s->mutex);
+ assert(pthread_mutex_unlock(&s->mutex) == 0);
return s->flag;
}
*pb = b;
}
+void open_meshlink_pair_ephemeral(meshlink_handle_t **pa, meshlink_handle_t **pb, const char *prefix) {
+ // Create two new MeshLink instances
+
+ *pa = *pb = NULL;
+
+ meshlink_handle_t *a = meshlink_open_ephemeral("a", prefix, DEV_CLASS_BACKBONE);
+ meshlink_handle_t *b = meshlink_open_ephemeral("b", prefix, DEV_CLASS_BACKBONE);
+
+ assert(a);
+ assert(b);
+
+ meshlink_enable_discovery(a, false);
+ meshlink_enable_discovery(b, false);
+
+ link_meshlink_pair(a, b);
+
+ *pa = a;
+ *pb = b;
+}
+
// 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) {
(void)node;
void start_meshlink_pair(meshlink_handle_t *a, meshlink_handle_t *b) {
struct sync_flag pair_status = {.flag = false};
+ init_sync_flag(&pair_status);
a->priv = &pair_status;
meshlink_set_node_status_cb(a, pair_status_cb);