diff options
-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); |