aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Peach <mrpeach@users.sourceforge.net>2011-11-04 21:24:53 +0000
committerMartin Peach <mrpeach@users.sourceforge.net>2011-11-04 21:24:53 +0000
commit8cbbe4d6259efc1366b67929d16e32bd3c36c753 (patch)
tree1218a227adfcc402757b47d6a391a282c8e4dd28
parentc1a4500d6c422f5d4a4302210da758379589b044 (diff)
Add a flag to sendthreadparams to indicate if the thread is in use or not. Don't reuse the buffer if it's still active.
svn path=/trunk/externals/mrpeach/; revision=15704
-rw-r--r--net/tcpclient.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/net/tcpclient.c b/net/tcpclient.c
index a1656ef..d9b535d 100644
--- a/net/tcpclient.c
+++ b/net/tcpclient.c
@@ -66,6 +66,7 @@ typedef struct _tcpclient_sender_params
int x_buf_len;
int x_sendresult;
pthread_t sendthreadid;
+ int threadisvalid; /* non-zero if sendthreadid is an active thread */
struct _tcpclient *x_x;
} t_tcpclient_sender_params;
#define MAX_TCPCLIENT_THREADS 32
@@ -249,7 +250,7 @@ static void tcpclient_disconnect(t_tcpclient *x)
{
for (i = 0; i < MAX_TCPCLIENT_THREADS;++i)
{ /* wait for any sender threads to finish */
- while (x->x_tsp[i].sendthreadid != 0);
+ while (x->x_tsp[i].threadisvalid != 0);
}
sys_closesocket(x->x_fd);
x->x_fd = -1;
@@ -349,6 +350,7 @@ static int tcpclient_send_buf(t_tcpclient *x, char *buf, int buf_len)
return 0;
}
max = (buf_len > MAX_TCPCLIENT_SEND_BUF)? MAX_TCPCLIENT_SEND_BUF: buf_len;
+ while(0 != tsp->threadisvalid); /* wait for thread to clear */
for (i = 0; i < max; ++i)
{
tsp->x_sendbuf[i] = buf[i];
@@ -356,9 +358,10 @@ static int tcpclient_send_buf(t_tcpclient *x, char *buf, int buf_len)
tsp->x_buf_len = i;
x->x_sendbuf_len += i;
tsp->x_x = x;
-
+ tsp->threadisvalid = 1;
if((tsp->x_sendresult = pthread_create(&tsp->sendthreadid, &x->x_sendthreadattr, tcpclient_child_send, tsp)) < 0)
{
+ tsp->threadisvalid = 0;
post("%s_send_buf: could not create new thread (%d)", objName);
clock_delay(x->x_sendclock, 0); // calls tcpclient_sent
return 0;
@@ -375,7 +378,7 @@ static void *tcpclient_child_send(void *w)
tsp->x_sendresult = send(tsp->x_x->x_fd, tsp->x_sendbuf, tsp->x_buf_len, 0);
clock_delay(tsp->x_x->x_sendclock, 0); // calls tcpclient_sent when it's safe to do so
- tsp->sendthreadid = 0;
+ tsp->threadisvalid = 0; /* this thread is over */
return(tsp);
}