X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FClientSocket.c;h=c49577724393e3de6b1443841072ff8e1ed46105;hp=80f4c37d2cae7f73fa4cdd4b996858bfa528d551;hb=c32e8254ec4ed0d77757e32f8aa5aabcdb494057;hpb=77b1c3e45f25e5a000b06a551e3b2329ad2db8a0 diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 80f4c37..c495777 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -33,6 +33,12 @@ struct socket_list { #ifdef HAVE_THREADS static pthread_mutex_t synchronized; static pthread_mutex_t synchronized_recv; + +struct ParseOrder { + unsigned long tid; + struct ParseOrder *next; +}; +struct ParseOrder *parse_order = NULL; #endif //the magic list :P @@ -369,6 +375,49 @@ int write_socket(struct ClientSocket *client, char* msg, int len) { return write_socket_force(client, msg, len); } +#if HAVE_THREADS +static void clientsocket_start_of_recv(unsigned long tid) { + SYNCHRONIZE(whohandler_sync); + struct ParseOrder *entry, *last; + for(last = parse_order; last; last = last->next) { + if(last->next == NULL) + break; + } + entry = malloc(sizeof(*entry)); + entry->tid = tid; + entry->next = NULL; + if(last) + last->next = entry; + else + parse_order = entry; + DESYNCHRONIZE(whohandler_sync); +} + +static void clientsocket_end_of_recv(unsigned long tid) { + SYNCHRONIZE(whohandler_sync); + struct ParseOrder *entry, *last = NULL; + for(entry = parse_order; entry; entry = entry->next) { + if(entry->tid == tid) { + if(last) + last->next = entry->next; + else + parse_order = entry->next; + free(entry); + break; + } else + last = entry; + } + DESYNCHRONIZE(whohandler_sync); +} + +int clientsocket_parseorder_top(unsigned long tid) { + if(parse_order && parse_order->tid == tid) + return 1; + else + return 0; +} +#endif + void socket_loop(int timeout_seconds) { if(sockets == NULL) return; int is_synchronized = 1; @@ -446,10 +495,10 @@ void socket_loop(int timeout_seconds) { } is_synchronized = 0; unsigned long tid = syscall(SYS_gettid); - whohandler_start_of_recv(sock, tid); + clientsocket_start_of_recv(tid); DESYNCHRONIZE(synchronized_recv); parse_lines(sock, linesbuf, used); - whohandler_end_of_recv(sock, tid); //WHOHandler hack (unlock WHOQueue mutexes) + clientsocket_end_of_recv(tid); #else int used = parse_lines(sock, sock->buffer, sock->bufferpos); if(used == sock->bufferpos + 1) {