From 748794bb46304b1f6c2698c116f366070026cfee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jul 2012 20:45:13 +0000 Subject: when destroying sender, wait until queue is finished so we don't get callbacks from a non-empty queue once the sender has vanished svn path=/trunk/externals/iem/iemnet/; revision=16153 --- iemnet_sender.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/iemnet_sender.c b/iemnet_sender.c index 1af60a6..b84d8ce 100644 --- a/iemnet_sender.c +++ b/iemnet_sender.c @@ -113,13 +113,20 @@ static int iemnet__sender_dosend(int sockfd, t_iemnet_queue*q) { static void*iemnet__sender_sendthread(void*arg) { t_iemnet_sender*sender=(t_iemnet_sender*)arg; - int sockfd=sender->sockfd; - t_iemnet_queue*q=sender->queue; + int sockfd=-1; + t_iemnet_queue*q=NULL; + LOCK(&sender->mtx); + sockfd=sender->sockfd; + q=sender->queue; while(sender->keepsending) { - if(!iemnet__sender_dosend(sockfd, q))break; + UNLOCK(&sender->mtx); + if(!iemnet__sender_dosend(sockfd, q)){ + LOCK(&sender->mtx); + break; + } + LOCK(&sender->mtx); } - LOCK (&sender->mtx); sender->isrunning=0; UNLOCK (&sender->mtx); DEBUG("send thread terminated"); @@ -159,6 +166,14 @@ void iemnet__sender_destroy(t_iemnet_sender*s) { return; } s->keepsending=0; + + while(s->isrunning) { + s->keepsending=0; + queue_finish(s->queue); + UNLOCK (&s->mtx); + LOCK (&s->mtx); + } + UNLOCK (&s->mtx); queue_finish(s->queue); -- cgit v1.2.1