diff options
author | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2012-07-13 20:45:13 +0000 |
---|---|---|
committer | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2012-07-13 20:45:13 +0000 |
commit | 748794bb46304b1f6c2698c116f366070026cfee (patch) | |
tree | bad780ce0c7613b02abe07791116f15a565b42c8 | |
parent | 69eeec4549081fd11a60f6eeb28e2a51421b7122 (diff) |
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
-rw-r--r-- | iemnet_sender.c | 23 |
1 files 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); |