logger(mesh, MESHLINK_DEBUG, "Could not start thread: %s\n", strerror(errno));
memset(&mesh->thread, 0, sizeof(mesh)->thread);
meshlink_errno = MESHLINK_EINTERNAL;
+ event_loop_stop(&mesh->loop);
pthread_mutex_unlock(&(mesh->mesh_mutex));
return false;
}
}
}
- // Wait for the main thread to finish
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- pthread_join(mesh->thread, NULL);
- pthread_mutex_lock(&(mesh->mesh_mutex));
+ if(mesh->threadstarted) {
+ // Wait for the main thread to finish
+ pthread_mutex_unlock(&(mesh->mesh_mutex));
+ pthread_join(mesh->thread, NULL);
+ pthread_mutex_lock(&(mesh->mesh_mutex));
- mesh->threadstarted = false;
+ mesh->threadstarted = false;
+ }
// Close all metaconnections
if(mesh->connections) {
if(mesh->outgoings) {
list_delete_list(mesh->outgoings);
+ mesh->outgoings = NULL;
}
- mesh->outgoings = NULL;
-
pthread_mutex_unlock(&(mesh->mesh_mutex));
}
static ssize_t channel_send(struct utcp *utcp, const void *data, size_t len) {
node_t *n = utcp->priv;
+
+ if(n->status.destroyed) {
+ return -1;
+ }
+
meshlink_handle_t *mesh = n->mesh;
return meshlink_send(mesh, (meshlink_node_t *)n, data, len) ? (ssize_t)len : -1;
}