aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2012-07-13 20:45:13 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2012-07-13 20:45:13 +0000
commit748794bb46304b1f6c2698c116f366070026cfee (patch)
treebad780ce0c7613b02abe07791116f15a565b42c8
parent69eeec4549081fd11a60f6eeb28e2a51421b7122 (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.c23
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);