summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2022-05-22 17:52:52 +0200
committerSander Vrijders <sander@ouroboros.rocks>2022-05-25 08:10:22 +0200
commitb9d674dc5a63b0206d96ff67366ed84c6d5d2962 (patch)
tree1e5d66facb9d1116cfbead95133181dfee5263cd
parent072f555c07318a946cd2131b9b261d11a96fbbf8 (diff)
downloadouroboros-b9d674dc5a63b0206d96ff67366ed84c6d5d2962.tar.gz
ouroboros-b9d674dc5a63b0206d96ff67366ed84c6d5d2962.zip
lib: Fix dealloc with unread keepalives
The dealloc call will now always do a non-blocking read before attempting to destroy the rbuff, ensuring all keepalives are processed. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
-rw-r--r--src/lib/dev.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 8a723b63..8bc840a5 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -934,10 +934,12 @@ int flow_join(const char * dst,
int flow_dealloc(int fd)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg;
- struct flow * f;
- time_t timeo;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ uint8_t buf[128];
+ struct timespec tic = {0, TICTIME};
+ struct flow * f;
+ time_t timeo;
if (fd < 0 || fd >= SYS_MAX_FLOWS )
return -EINVAL;
@@ -961,16 +963,20 @@ int flow_dealloc(int fd)
msg.flow_id = f->flow_id;
+ f->oflags = FLOWFDEFAULT | FLOWFRNOPART;
+
+ f->rcv_timesout = true;
+ f->rcv_timeo = tic;
+
+ pthread_rwlock_unlock(&ai.lock);
+
+ flow_read(fd, buf, 128);
+
+ pthread_rwlock_rdlock(&ai.lock);
+
timeo = frcti_dealloc(f->frcti);
while (timeo < 0) { /* keep the flow active for rtx */
ssize_t ret;
- uint8_t buf[128];
- struct timespec tic = {0, TICTIME};
-
- f->oflags = FLOWFDEFAULT | FLOWFRNOPART;
-
- f->rcv_timesout = true;
- f->rcv_timeo = tic;
pthread_rwlock_unlock(&ai.lock);
@@ -986,9 +992,11 @@ int flow_dealloc(int fd)
msg.timeo_sec = timeo;
+ pthread_cleanup_push(__cleanup_rwlock_unlock, &ai.lock);
+
shm_rbuff_fini(ai.flows[fd].tx_rb);
- pthread_rwlock_unlock(&ai.lock);
+ pthread_cleanup_pop(true);
recv_msg = send_recv_irm_msg(&msg);
if (recv_msg == NULL)