From: pk910 Date: Mon, 23 Jan 2012 15:45:59 +0000 (+0100) Subject: fixed WIN32 support X-Git-Tag: v5.3~44 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=2b9e305af713f0960ac0cd7645af3e0ef85a8515 fixed WIN32 support --- diff --git a/.gitignore b/.gitignore index a3d7d92..34025fe 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ Makefile missing stamp-h1 neonserv -neonserv.exe +neonserv*.exe libmysql.dll +pthreadGC2.dll motd.txt \ No newline at end of file diff --git a/src/ClientSocket.c b/src/ClientSocket.c index c495777..6d2c34e 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -35,7 +35,7 @@ static pthread_mutex_t synchronized; static pthread_mutex_t synchronized_recv; struct ParseOrder { - unsigned long tid; + unsigned int tid; struct ParseOrder *next; }; struct ParseOrder *parse_order = NULL; @@ -230,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; @@ -376,7 +376,7 @@ int write_socket(struct ClientSocket *client, char* msg, int len) { } #if HAVE_THREADS -static void clientsocket_start_of_recv(unsigned long tid) { +static void clientsocket_start_of_recv(unsigned int tid) { SYNCHRONIZE(whohandler_sync); struct ParseOrder *entry, *last; for(last = parse_order; last; last = last->next) { @@ -393,7 +393,7 @@ static void clientsocket_start_of_recv(unsigned long tid) { DESYNCHRONIZE(whohandler_sync); } -static void clientsocket_end_of_recv(unsigned long tid) { +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) { @@ -410,7 +410,7 @@ static void clientsocket_end_of_recv(unsigned long tid) { DESYNCHRONIZE(whohandler_sync); } -int clientsocket_parseorder_top(unsigned long tid) { +int clientsocket_parseorder_top(unsigned int tid) { if(parse_order && parse_order->tid == tid) return 1; else @@ -494,7 +494,7 @@ void socket_loop(int timeout_seconds) { sock->bufferpos -= used; } is_synchronized = 0; - unsigned long tid = syscall(SYS_gettid); + unsigned int tid = (unsigned int) pthread_self_tid(); clientsocket_start_of_recv(tid); DESYNCHRONIZE(synchronized_recv); parse_lines(sock, linesbuf, used); diff --git a/src/ClientSocket.h b/src/ClientSocket.h index 1ab7139..3754399 100644 --- a/src/ClientSocket.h +++ b/src/ClientSocket.h @@ -84,7 +84,7 @@ int disconnect_socket(struct ClientSocket *client); int write_socket_force(struct ClientSocket *client, char* msg, int len); int write_socket(struct ClientSocket *client, char* msg, int len); #ifdef HAVE_THREADS -int clientsocket_parseorder_top(unsigned long tid); +int clientsocket_parseorder_top(unsigned int tid); #endif void socket_loop(int timeout_seconds); void putsock(struct ClientSocket *client, const char *text, ...) PRINTF_LIKE(2, 3); diff --git a/src/HandleInfoHandler.c b/src/HandleInfoHandler.c index 0508e07..6e5415f 100644 --- a/src/HandleInfoHandler.c +++ b/src/HandleInfoHandler.c @@ -207,7 +207,7 @@ static void recv_notice(struct UserNode *user, struct UserNode *target, char *me if(do_match) { #ifdef HAVE_THREADS - unsigned long tid = syscall(SYS_gettid); + unsigned int tid = (unsigned int) pthread_self_tid(); while(!clientsocket_parseorder_top(tid)) { usleep(1000); //1ms } diff --git a/src/IRCParser.c b/src/IRCParser.c index 97e851a..eed9380 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -58,7 +58,7 @@ static void parse_line(struct ClientSocket *client, char *line) { int argc = 0; char *argv[MAXNUMPARAMS]; #ifdef HAVE_THREADS - printf("[%lu recv %lu] %s\n", syscall(SYS_gettid), (unsigned long) strlen(line), line); + printf("[%d recv %lu] %s\n", getCurrentThreadID(), (unsigned long) strlen(line), line); #else printf("[recv %lu] %s\n", (unsigned long) strlen(line), line); #endif diff --git a/src/QServer.c b/src/QServer.c index fd10beb..fd0e8e6 100644 --- a/src/QServer.c +++ b/src/QServer.c @@ -25,6 +25,10 @@ #include "ConfigParser.h" #include "bots.h" +#ifdef WIN32 +typedef uint32_t socklen_t; +#endif + #define QSERVER_TIMEOUT 30 #define QSERVER_MAXCLIENTS 100 @@ -52,7 +56,7 @@ void qserver_init() { if (server_sockfd < 0) return; struct sockaddr_in serv_addr; - bzero((char *) &serv_addr, sizeof(serv_addr)); + memset(&serv_addr, 0, sizeof(serv_addr)); int portno = get_int_field("QServer.port"); if(!portno) portno = 7499; diff --git a/src/WHOHandler.c b/src/WHOHandler.c index f8769de..2854718 100644 --- a/src/WHOHandler.c +++ b/src/WHOHandler.c @@ -242,7 +242,7 @@ static void _recv_whohandler_354(struct ClientSocket *client, char **argv, unsig struct WHOQueueEntry* entry = getNextWHOQueueEntry(client, type, 0); if(entry == NULL) return; #ifdef HAVE_THREADS - unsigned long tid = syscall(SYS_gettid); + unsigned int tid = (unsigned int) pthread_self_tid(); while(!clientsocket_parseorder_top(tid)) { usleep(1000); //1ms } @@ -338,7 +338,7 @@ static void _recv_whohandler_315(struct ClientSocket *client, char **argv, unsig struct WHOQueueEntry* entry = getNextWHOQueueEntry(client, type, 0); if(entry == NULL) return; #ifdef HAVE_THREADS - unsigned long tid = syscall(SYS_gettid); + unsigned int tid = (unsigned int) pthread_self_tid(); while(!clientsocket_parseorder_top(tid)) { usleep(1000); //1ms } diff --git a/src/cmd_global_netinfo.c b/src/cmd_global_netinfo.c index 1e68aaa..3d01c98 100644 --- a/src/cmd_global_netinfo.c +++ b/src/cmd_global_netinfo.c @@ -146,7 +146,7 @@ CMD_BIND(global_cmd_netinfo) { #ifdef HAVE_THREADS content[0] = get_language_string(user, "NS_NETINFO_THREADS"); - sprintf(tmp, "%d (current tid: %lu)", running_threads, syscall(SYS_gettid)); + sprintf(tmp, "%d (current thread: %i)", running_threads, getCurrentThreadID()); content[1] = tmp; table_add(table, content); #endif diff --git a/src/main.c b/src/main.c index 17980b4..b86633e 100644 --- a/src/main.c +++ b/src/main.c @@ -101,6 +101,8 @@ static int load_mysql_config() { } #ifdef HAVE_THREADS +pthread_t *current_threads = NULL; + void * thread_main(void *arg) { time_t socket_wait; while(running) { @@ -114,6 +116,22 @@ void * thread_main(void *arg) { running_threads--; return NULL; } + +int getCurrentThreadID() { + if(!current_threads) return 0; + int i; + unsigned int my_tid = (unsigned int) pthread_self_tid(); + for(i = 0; i < running_threads; i++) { + #ifdef WIN32 + if((unsigned int) current_threads[i].p == my_tid) + #else + if((unsigned int) current_threads[i] == my_tid) + #endif + return i+1; + } + return 0; +} + #endif int main(int argc, char *argv[]) { @@ -170,14 +188,13 @@ main: int worker_threads = get_int_field("General.worker_threads"); if(!worker_threads) worker_threads = 1; - running = 1; #ifdef HAVE_THREADS - pthread_t tid[worker_threads]; int tid_id = 0; + current_threads = calloc(worker_threads, sizeof(*current_threads)); for(tid_id = 0; tid_id < worker_threads; tid_id++) { running_threads++; - pthread_create(&tid[tid_id], NULL, thread_main, NULL); + pthread_create(¤t_threads[tid_id], NULL, thread_main, NULL); } int usleep_delay = 1000000 / TICKS_PER_SECOND; while(running) { @@ -188,7 +205,7 @@ main: usleep(usleep_delay); } for(tid_id = 0; tid_id < worker_threads; tid_id++) { - pthread_join(tid[tid_id], NULL); + pthread_join(current_threads[tid_id], NULL); } running_threads = 0; #else diff --git a/src/main.h b/src/main.h index 6a2a99f..d14869e 100644 --- a/src/main.h +++ b/src/main.h @@ -21,7 +21,6 @@ #define NEONSERV_VERSION "5.3" #define VERSION_PATCHLEVEL 543 -#include #include #include #include @@ -31,6 +30,7 @@ #include #include #else +#include #include #include #include @@ -45,7 +45,11 @@ #include #ifdef HAVE_THREADS #include -#include +#ifdef WIN32 +#define pthread_self_tid() pthread_self().p +#else +#define pthread_self_tid() pthread_self() +#endif #define THREAD_MUTEX_INIT(var) { \ pthread_mutexattr_t mutex_attr; \ pthread_mutexattr_init(&mutex_attr);\ @@ -136,6 +140,8 @@ extern int statistics_enabled; extern int running_threads; extern pthread_mutex_t cache_sync; extern pthread_mutex_t whohandler_sync, whohandler_mass_sync; + +int getCurrentThreadID(); #endif int stricmp (const char *s1, const char *s2); diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 12ab76d..3e5dd19 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -19,7 +19,7 @@ #define DATABASE_VERSION "15" struct mysql_conn_struct { - unsigned long tid; + unsigned int tid; MYSQL *mysql_conn; struct used_result *used_results; struct escaped_string *escaped_strings; @@ -264,9 +264,9 @@ char* escape_string(const char *str) { struct mysql_conn_struct *get_mysql_conn_struct() { SYNCHRONIZE(synchronized); struct mysql_conn_struct *mysql_conn; - unsigned long tid; + unsigned int tid; #ifdef HAVE_THREADS - tid = syscall(SYS_gettid); + tid = (unsigned int) pthread_self_tid(); #else tid = 1; #endif