From 8040cd58bcfa3d316572399c677f4ac2361a1f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 14 Sep 2010 08:53:29 +0000 Subject: receive in nonblocking mode svn path=/trunk/externals/iem/iemnet/; revision=14139 --- iemnet_receiver.c | 57 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/iemnet_receiver.c b/iemnet_receiver.c index 0576c4e..160de17 100644 --- a/iemnet_receiver.c +++ b/iemnet_receiver.c @@ -37,7 +37,7 @@ struct _iemnet_receiver { /* notifies Pd that there is new data to fetch */ static void iemnet_signalNewData(t_iemnet_receiver*x) { int already=0; - int locked=0; + int trylock=0; pthread_mutex_lock(&x->newdata_mtx); already=x->newdataflag; x->newdataflag=1; @@ -51,16 +51,22 @@ static void iemnet_signalNewData(t_iemnet_receiver*x) { return; } - /* + /* * try to lock Pd's main mutex * this is bound to deadlock if this function is called from within Pd's mainthread * (which happens when we destroy the receiver and signalNewData is called on cleanup) * * - shan't we check whether sys_trylock() returns EBUSY ? */ - locked=(0==sys_trylock()); - if(x->clock)clock_delay(x->clock, 0); - if(locked)sys_unlock(); + trylock=sys_trylock(); + switch(trylock) { + case 0: + case EBUSY: + if(x->clock)clock_delay(x->clock, 0); + if(0==trylock)sys_unlock(); + default: + break; + } } @@ -79,6 +85,8 @@ static void*iemnet__receiver_readthread(void*arg) { struct sockaddr_in from; socklen_t fromlen = sizeof(from); + int recv_flags=0; + struct timeval timout; fd_set readset; FD_ZERO(&readset); @@ -93,10 +101,10 @@ static void*iemnet__receiver_readthread(void*arg) { t_iemnet_chunk*c=NULL; pthread_mutex_lock(&receiver->keeprec_mtx); - if(!receiver->keepreceiving) { + if(!receiver->keepreceiving) { pthread_mutex_unlock(&receiver->keeprec_mtx); break; - } + } pthread_mutex_unlock(&receiver->keeprec_mtx); fromlen = sizeof(from); @@ -104,25 +112,26 @@ static void*iemnet__receiver_readthread(void*arg) { timout.tv_sec=0; timout.tv_usec=1000; + recv_flags|=MSG_DONTWAIT; select(sockfd+1, &rs, NULL, NULL, &timout); - if (FD_ISSET(sockfd, &rs)) { - DEBUG("select can read"); - - //fprintf(stderr, "reading %d bytes...\n", size); - //result = recv(sockfd, data, size, 0); - - result = recvfrom(sockfd, data, size, 0, (struct sockaddr *)&from, &fromlen); - //fprintf(stderr, "read %d bytes...\n", result); - DEBUG("recfrom %d bytes", result); - if(result<=0)break; - c= iemnet__chunk_create_dataaddr(result, data, &from); - DEBUG("pushing"); - queue_push(q, c); - DEBUG("signalling"); - iemnet_signalNewData(receiver); - DEBUG("rereceive"); - } + if (!FD_ISSET(sockfd, &rs))continue; + + DEBUG("select can read"); + + //fprintf(stderr, "reading %d bytes...\n", size); + //result = recv(sockfd, data, size, 0); + + result = recvfrom(sockfd, data, size, recv_flags, (struct sockaddr *)&from, &fromlen); + //fprintf(stderr, "read %d bytes...\n", result); + DEBUG("recfrom %d bytes", result); + if(result<=0)break; + c= iemnet__chunk_create_dataaddr(result, data, &from); + DEBUG("pushing"); + queue_push(q, c); + DEBUG("signalling"); + iemnet_signalNewData(receiver); + DEBUG("rereceive"); } // oha DEBUG("readthread loop termination: %d", result); -- cgit v1.2.1