X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FClientSocket.c;h=27896187b19385b48d17fbb1af3145c9c828ba54;hp=647a63396bff25ebca2c4f54b1782edc47fea9f0;hb=f90d21daf31f8d69e24406678be696afa8cae962;hpb=b46d9426eba4685b2c84fb82b1521aafd3488da2 diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 647a633..2789618 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -32,6 +32,7 @@ struct socket_list { #ifdef HAVE_THREADS static pthread_mutex_t synchronized; +static pthread_mutex_t synchronized_recv; #endif //the magic list :P @@ -40,6 +41,7 @@ static char buffer[BUF_SIZ]; void init_sockets() { THREAD_MUTEX_INIT(synchronized); + THREAD_MUTEX_INIT(synchronized_recv); sockets = malloc(sizeof(*sockets)); if (!sockets) @@ -370,7 +372,7 @@ int write_socket(struct ClientSocket *client, char* msg, int len) { void socket_loop(int timeout_seconds) { if(sockets == NULL) return; int is_synchronized = 1; - SYNCHRONIZE(synchronized); + SYNCHRONIZE(synchronized_recv); fd_set fds; struct timeval timeout; struct ClientSocket *sock, *next; @@ -387,7 +389,7 @@ void socket_loop(int timeout_seconds) { timeout.tv_usec = 0; ret = select(ret + 1, &fds, NULL, NULL, &timeout); if(ret == 0) { - DEDESYNCHRONIZE(synchronized); + DESYNCHRONIZE(synchronized_recv); return; } for (sock = sockets->data; sock; sock = next) { @@ -424,8 +426,28 @@ void socket_loop(int timeout_seconds) { sock->flags |= SOCKET_FLAG_QUITTED; } else { sock->traffic_in += bytes; + #ifdef HAVE_THREADS + char linesbuf[BUF_SIZ*2]; + strcpy(linesbuf, sock->buffer); + int used = 0; + for(i = 0; i < sock->bufferpos; i++) { + if(sock->buffer[i] == '\n') { + used = i+1; + } + } + if(used == sock->bufferpos + 1) { + //used all bytes so just reset the bufferpos + sock->bufferpos = 0; + } else { + for(i = 0; i < sock->bufferpos - used; i++) { + sock->buffer[i] = sock->buffer[i+used]; + } + sock->bufferpos -= used; + } is_synchronized = 0; - DESYNCHRONIZE(synchronized); + DESYNCHRONIZE(synchronized_recv); + parse_lines(sock, linesbuf, used); + #else int used = parse_lines(sock, sock->buffer, sock->bufferpos); if(used == sock->bufferpos + 1) { //used all bytes so just reset the bufferpos @@ -436,6 +458,9 @@ void socket_loop(int timeout_seconds) { } sock->bufferpos -= used; } + is_synchronized = 0; + DESYNCHRONIZE(synchronized_recv); + #endif #ifdef HAVE_THREADS FD_ZERO(&fds); //zero out all other pending sockets here (we have other threads receiving from them) #endif @@ -451,7 +476,7 @@ void socket_loop(int timeout_seconds) { } } if(is_synchronized) { - DESYNCHRONIZE(synchronized); + DESYNCHRONIZE(synchronized_recv); } }