diff options
author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-10-07 15:25:22 +0200 |
---|---|---|
committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-10-07 15:42:44 +0200 |
commit | 71f10f5efab37f3df3d909d324cff2e098d21c85 (patch) | |
tree | 90d6031870d02b557107b0bc2623a129c4b1d074 /src/lib/sockets.c | |
parent | aa0eac4f93b80537d02123715842d594a8ff3aad (diff) | |
download | ouroboros-71f10f5efab37f3df3d909d324cff2e098d21c85.tar.gz ouroboros-71f10f5efab37f3df3d909d324cff2e098d21c85.zip |
lib, dev: Add asynchronous deallocation
Flow deallocation from the application will immediately return (void
call). The IRMd will not send a reply message.
Diffstat (limited to 'src/lib/sockets.c')
-rw-r--r-- | src/lib/sockets.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/lib/sockets.c b/src/lib/sockets.c index 408e79e7..c8375c22 100644 --- a/src/lib/sockets.c +++ b/src/lib/sockets.c @@ -154,6 +154,39 @@ static irm_msg_t * send_recv_irm_msg_timed(irm_msg_t * msg, bool timed) return recv_msg; } +void send_irm_msg(irm_msg_t * msg) +{ + int sockfd; + buffer_t buf; + + sockfd = client_socket_open(IRM_SOCK_PATH); + if (sockfd < 0) + return; + + buf.len = irm_msg__get_packed_size(msg); + if (buf.len == 0) { + close(sockfd); + return; + } + + buf.data = malloc(buf.len); + if (buf.data == NULL) { + close(sockfd); + return; + } + + pthread_cleanup_push(close_ptr, &sockfd); + pthread_cleanup_push((void (*)(void *)) free, (void *) buf.data); + + irm_msg__pack(msg, buf.data); + + if (write(sockfd, buf.data, buf.len) < 0) + return; + + pthread_cleanup_pop(true); + pthread_cleanup_pop(true); +} + irm_msg_t * send_recv_irm_msg(irm_msg_t * msg) { return send_recv_irm_msg_timed(msg, true); } |