From a4f7c437b828b67da222e971c54e855b4dd67be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 29 Mar 2010 14:10:22 +0000 Subject: provide feedback to Pd main-thread whether sender-thread still exists svn path=/trunk/externals/iem/iemnet/; revision=13300 --- iemnet.c | 16 +++++++++++++--- tcpserver.c | 7 ++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/iemnet.c b/iemnet.c index 1d44144..46b8332 100644 --- a/iemnet.c +++ b/iemnet.c @@ -373,6 +373,7 @@ struct _iemnet_sender { int sockfd; /* owned outside; must call iemnet__sender_destroy() before freeing socket yourself */ t_queue*queue; int keepsending; // indicates whether we want to thread to continue or to terminate + int isrunning; }; /* the workhorse of the family */ @@ -384,9 +385,15 @@ static int iemnet__sender_dosend(int sockfd, t_queue*q) { unsigned int size=c->size; int result=-1; // fprintf(stderr, "sending %d bytes at %x to %d\n", size, data, sockfd); - + DEBUG("sending %d bytes", size); result = send(sockfd, data, size, 0); + if(result<0) { + // broken pipe + return 0; + } + // shouldn't we do something with the result here? + DEBUG("sent %d bytes", result); iemnet__chunk_destroy(c); } else { return 0; @@ -403,13 +410,15 @@ static void*iemnet__sender_sendthread(void*arg) { while(sender->keepsending) { if(!iemnet__sender_dosend(sockfd, q))break; } - //fprintf(stderr, "write thread terminated\n"); + sender->isrunning=0; + DEBUG("send thread terminated"); return NULL; } int iemnet__sender_send(t_iemnet_sender*s, t_iemnet_chunk*c) { t_queue*q=s->queue; - int size=0; + int size=-1; + if(!s->isrunning)return -1; if(q) { t_iemnet_chunk*chunk=iemnet__chunk_create_chunk(c); size = queue_push(q, chunk); @@ -448,6 +457,7 @@ t_iemnet_sender*iemnet__sender_create(int sock) { result->queue = queue_create(); result->sockfd = sock; result->keepsending =1; + result->isrunning=1; res=pthread_create(&result->thread, 0, iemnet__sender_sendthread, result); diff --git a/tcpserver.c b/tcpserver.c index 8a5673b..fc2cd0f 100644 --- a/tcpserver.c +++ b/tcpserver.c @@ -148,7 +148,7 @@ static int tcpserver_fixindex(t_tcpserver*x, int client) } /* ---------------- main tcpserver (send) stuff --------------------- */ - +static void tcpserver_disconnect_socket(t_tcpserver *x, t_floatarg fsocket); static void tcpserver_send_bytes(t_tcpserver*x, int client, t_iemnet_chunk*chunk) { if(x && x->x_sr && x->x_sr[client]) { @@ -166,6 +166,11 @@ static void tcpserver_send_bytes(t_tcpserver*x, int client, t_iemnet_chunk*chunk SETFLOAT(&output_atom[1], size); SETFLOAT(&output_atom[2], sockfd); outlet_anything( x->x_status_outlet, gensym("sent"), 3, output_atom); + + if(size<0) { + // disconnected! + tcpserver_disconnect_socket(x, sockfd); + } } } -- cgit v1.2.1