X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmeshlink.c;h=4280c4f13797c27919f1790ac5be59ce442a12d8;hb=39f2e20489cbc3e924547b684340bf722a0df028;hp=63feee2c88420b6670251eb697e3fe0aac1f6ce5;hpb=777055274c4a1959318330800e449a2bc27835fb;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index 63feee2c..4280c4f1 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -4252,6 +4252,32 @@ void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel pthread_mutex_unlock(&mesh->mutex); } +void meshlink_channel_abort(meshlink_handle_t *mesh, meshlink_channel_t *channel) { + if(!mesh || !channel) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + + if(pthread_mutex_lock(&mesh->mutex) != 0) { + abort(); + } + + if(channel->c) { + utcp_abort(channel->c); + channel->c = NULL; + + /* Clean up any outstanding AIO buffers. */ + aio_abort(mesh, channel, &channel->aio_send); + aio_abort(mesh, channel, &channel->aio_receive); + } + + if(!channel->in_callback) { + free(channel); + } + + pthread_mutex_unlock(&mesh->mutex); +} + ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) { if(!mesh || !channel) { meshlink_errno = MESHLINK_EINVAL;