#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
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;
}
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) {