X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FClientSocket.c;h=6d2c34e5d20efe744237d1d6b3fab270a15c7607;hb=2b9e305af713f0960ac0cd7645af3e0ef85a8515;hp=27896187b19385b48d17fbb1af3145c9c828ba54;hpb=f90d21daf31f8d69e24406678be696afa8cae962;p=NeonServV5.git diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 2789618..6d2c34e 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 int tid; + struct ParseOrder *next; +}; +struct ParseOrder *parse_order = NULL; #endif //the magic list :P @@ -224,7 +230,7 @@ static int _connect_socket(struct ClientSocket *client) { return 1; } #else -static int connect_socket(struct ClientSocket *client) { +static int _connect_socket(struct ClientSocket *client) { if((client->flags & SOCKET_FLAG_CONNECTED)) return 1; struct hostent *host; struct sockaddr_in addr; @@ -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 int 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 int 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 int 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; @@ -445,8 +494,11 @@ void socket_loop(int timeout_seconds) { sock->bufferpos -= used; } is_synchronized = 0; + unsigned int tid = (unsigned int) pthread_self_tid(); + clientsocket_start_of_recv(tid); DESYNCHRONIZE(synchronized_recv); parse_lines(sock, linesbuf, used); + clientsocket_end_of_recv(tid); #else int used = parse_lines(sock, sock->buffer, sock->bufferpos); if(used == sock->bufferpos + 1) {