fixes for multi thread support
authorpk910 <philipp@zoelle1.de>
Fri, 13 Jan 2012 16:48:27 +0000 (17:48 +0100)
committerpk910 <philipp@zoelle1.de>
Fri, 13 Jan 2012 17:56:57 +0000 (18:56 +0100)
18 files changed:
configure.ac
src/ClientSocket.c
src/bot_NeonHelp.c
src/bot_NeonServ.c
src/cmd_global_addbot.c
src/cmd_global_register.c
src/cmd_neonserv_addtimeban.c
src/cmd_neonserv_adduser.c
src/cmd_neonserv_chanservsync.c
src/cmd_neonserv_nicklist.c
src/cmd_neonserv_uset.c
src/event_neonserv_ctcp.c
src/event_neonserv_notice.c
src/event_neonspam_chanmsg.c
src/event_neonspam_join.c
src/main.c
src/main.h
src/mysqlConn.c

index 9dc6e4f2b1539a034ca5bf2192da1fb2b0719a8a..745ed802335334ebe35f791ea341bd957d07450f 100644 (file)
@@ -57,6 +57,8 @@ AC_ARG_ENABLE([debug],
   [CFLAGS='-g -O0 -Wall -Wshadow -Werror'],
   [CFLAGS='-g -O2'])
 
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+
 # Checks for header files.
 AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h windows.h winsock2.h])
 
index 647a63396bff25ebca2c4f54b1782edc47fea9f0..27896187b19385b48d17fbb1af3145c9c828ba54 100644 (file)
@@ -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);
     }
 }
 
index ab241c15cbbb68bd85552f5f0ae7b938d9cc2e16..5e0e605076c9e3409f240ea6ef65536c7e9de80b 100644 (file)
@@ -263,7 +263,7 @@ static void neonhelp_event_privmsg_async(struct ClientSocket *client, struct Use
         }
     }
     printf_mysql_query("INSERT INTO `helpserv_requests` (`botid`, `host`, `hand`, `nick`, `status`, `supporter`, `time`, `text`) VALUES ('%d', '%s@%s', '%s', '%s', '0', '-1', UNIX_TIMESTAMP(), '%s')", client->clientid, escape_string(user->ident), escape_string(user->host), ((user->flags & USERFLAG_ISAUTHED) ? escape_string(user->auth) : "*"), escape_string(user->nick), escape_string(message));
-    helpnode->suppid = (int) mysql_insert_id(mysql_conn);
+    helpnode->suppid = (int) mysql_insert_id(get_mysql_conn());
     helpnode->log = NULL;
     helpnode->next = ((client->flags & SOCKET_HAVE_HELPNODE) ? client->botclass_helpnode : NULL);
     client->botclass_helpnode = helpnode;
index 00b87c2c6ed1da3acec1e1ca947435b18797e0ef..a0937b9b5f0abb60e6713ae36681788c1a3ac3ca 100644 (file)
@@ -214,6 +214,7 @@ static const struct default_language_entry msgtab[] = {
     {"NS_NETINFO_USER", "  User:"},
     {"NS_NETINFO_CHANUSER", "  Channel-User:"},
     {"NS_NETINFO_OTHER", "  Other:"},
+    {"NS_NETINFO_THREADS", "Threads:"},
     {"NS_NETINFO_VERSION", "Version:"},
     {"NS_NETINFO_CODE", "Code:"},
     {"NS_NETINFO_CODE_VALUE", "%s lines c code (view it at http://git.pk910.de/?p=NeonServV5.git;a=summary)"}, /* {ARGS: 20} */
index d30c742f162a8956fbb4223a3c9c11bbc458969a..1783834107ae5fab03b822e8d78746b5836d7288 100644 (file)
@@ -36,7 +36,7 @@ CMD_BIND(global_cmd_addbot) {
         return;
     }
     printf_mysql_query("INSERT INTO `bots` (`nick`, `botclass`) VALUES ('%s', '%d')", escape_string(argv[0]), botid);
-    botid = (int) mysql_insert_id(mysql_conn);
+    botid = (int) mysql_insert_id(get_mysql_conn());
     reply(getTextBot(), user, "NS_ADDBOT_DONE", argv[0], botid);
     logEvent(event);
 }
index 45e5a759cf25312ceb1f0ccd00b8fd076dc24165..548860d65053f350ae753bba69bdc182d48d478a 100644 (file)
@@ -210,7 +210,7 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
             userid = atoi(row[0]);
         } else {
             printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
-            userid = (int) mysql_insert_id(mysql_conn);
+            userid = (int) mysql_insert_id(get_mysql_conn());
         }
     }
     if(client->botid)
@@ -240,7 +240,7 @@ static void global_cmd_register_async1(struct ClientSocket *client, struct Clien
         printf_mysql_query("UPDATE `channels` SET `channel_registered` = UNIX_TIMESTAMP(), `channel_registrator` = '%d' WHERE `channel_id` = '%d'", adminid, chanid);
     } else {
         printf_mysql_query("INSERT INTO `channels` (`channel_name`, `channel_registered`, `channel_registrator`) VALUES ('%s', UNIX_TIMESTAMP(), '%d')", escape_string(channel), adminid);
-        chanid = (int) mysql_insert_id(mysql_conn);
+        chanid = (int) mysql_insert_id(get_mysql_conn());
     }
     struct ClientSocket *bot;
     for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
index 09202f5f7896e451f202b843e5d90a07a684b47b..837812e8e856e6264316c95ddd928bc83d815395 100644 (file)
@@ -119,7 +119,7 @@ static void neonserv_cmd_addtimeban_async1(struct ClientSocket *client, struct C
         return;
     //add the ban
     printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(mask), (unsigned long) (time(0) + duration), userid, escape_string(reason));
-    int banid = (int) mysql_insert_id(mysql_conn);
+    int banid = (int) mysql_insert_id(get_mysql_conn());
     putsock(client, "MODE %s +b %s", chan->name, mask);
     for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
         cuser = chanuser->user;
index 8eccf67873eb368ec1ac0f9ec311e8626c109013..0e8432b34c6a696d8be3e034dda81bbc59d98280 100644 (file)
@@ -151,7 +151,7 @@ static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct Clie
         }
     } else {
         printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
-        userid = (int) mysql_insert_id(mysql_conn);
+        userid = (int) mysql_insert_id(get_mysql_conn());
     }
     printf_mysql_query("INSERT INTO `chanusers` (`chanuser_cid`, `chanuser_uid`, `chanuser_access`) VALUES ('%d', '%d', '%d')", chan->channel_id, userid, caccess);
     reply(textclient, user, "NS_ADDUSER_DONE", nick, chan->name, caccess);
index 78967d45bc0f0e59d8791d5ead60d3d74511e24f..8581cb24be1155084a5da2bce450b2eed99f3059 100644 (file)
@@ -208,7 +208,7 @@ static void neonserv_cmd_chanservsync_notice_listener(struct UserNode *user, str
             neonserv_cmd_chanservsync_synchronize_user(neonserv_cmd_chanservsync_used->client, neonserv_cmd_chanservsync_used->textclient, neonserv_cmd_chanservsync_used->user, neonserv_cmd_chanservsync_used->chan, username, userid, caccess, seen_time, flags, 0);
         } else if(!stricmp(user->nick, "chanserv")) {
             printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(username));
-            userid = (int) mysql_insert_id(mysql_conn);
+            userid = (int) mysql_insert_id(get_mysql_conn());
             neonserv_cmd_chanservsync_synchronize_user(neonserv_cmd_chanservsync_used->client, neonserv_cmd_chanservsync_used->textclient, neonserv_cmd_chanservsync_used->user, neonserv_cmd_chanservsync_used->chan, username, userid, caccess, seen_time, flags, 1);
         } else {
             //lookup auth
@@ -240,7 +240,7 @@ static AUTHLOOKUP_CALLBACK(neonserv_cmd_chanservsync_auth_lookup) {
     struct neonserv_cmd_chanservsync_auth_cache *cache = data;
     if(exists) {
         printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(auth));
-        int userid = (int) mysql_insert_id(mysql_conn);
+        int userid = (int) mysql_insert_id(get_mysql_conn());
         neonserv_cmd_chanservsync_synchronize_user(cache->client, cache->textclient, cache->user, cache->chan, auth, userid, cache->caccess, cache->seen, cache->flags, 1);
     }
     free(cache);
index b04ccef6d2050d6fc04168fd01667cc2a8d8c6e3..6178198598f07d5ef4b9395fc1b70aea17034d2e 100644 (file)
@@ -229,7 +229,7 @@ static void neonserv_cmd_nicklist_synchronize_user(struct ChanNode *chan, struct
         userid = atoi(row[0]);
     } else {
         printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth));
-        userid = (int) mysql_insert_id(mysql_conn);
+        userid = (int) mysql_insert_id(get_mysql_conn());
     }
     //check if already added
     printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_seen` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
index 9e8a0c56f557593ac8d728100f894454091a8990..25a3118dbaad630eb14a9804a348bbe84c74a5e5 100644 (file)
@@ -79,7 +79,7 @@ CMD_BIND(neonserv_cmd_uset) {
                             userid = atoi(row[0]);
                         } else {
                             printf_mysql_query("INSERT INTO `users` (`user_user`) VALUES ('%s')", escape_string(user->auth));
-                            userid = (int) mysql_insert_id(mysql_conn);
+                            userid = (int) mysql_insert_id(get_mysql_conn());
                         }
                         printf_mysql_query("INSERT INTO `noinvite` (`uid`, `cid`) VALUES ('%d', '%d')", userid, chan->channel_id);
                         noinvite = 1;
index 99ff47ca4e6b3a61278c22f71da028e67204923c..11d03e25ae99285247b454daf3c8b14b45b93d8f 100644 (file)
@@ -93,7 +93,7 @@ static void neonserv_event_ctcp_async1(struct ClientSocket *client, struct UserN
                     duration = 3600;
                 banmask = generate_banmask(user, banmaskBuf);
                 printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(banmask), (unsigned long) (time(0) + duration), 0, escape_string(reason));
-                int banid = (int) mysql_insert_id(mysql_conn);
+                int banid = (int) mysql_insert_id(get_mysql_conn());
                 char nameBuf[MAXLEN];
                 char banidBuf[20];
                 sprintf(nameBuf, "ban_%d", banid);
index 11545bb5315fbc7c2b6a80b6b61d97946632cf9c..84fb51a25084da0394b3c8fc608b3d253f4cf213 100644 (file)
@@ -88,7 +88,7 @@ static void neonserv_event_notice_async1(struct ClientSocket *client, struct Use
                     duration = 3600;
                 banmask = generate_banmask(user, banmaskBuf);
                 printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chan->channel_id, escape_string(banmask), (unsigned long) (time(0) + duration), 0, escape_string(reason));
-                int banid = (int) mysql_insert_id(mysql_conn);
+                int banid = (int) mysql_insert_id(get_mysql_conn());
                 char nameBuf[MAXLEN];
                 char banidBuf[20];
                 sprintf(nameBuf, "ban_%d", banid);
index c5bc02f90d52a3abecca645f6db63be8eaa95ca0..163315db30fd03e13c096403d1b3fab85faa9b29 100644 (file)
@@ -243,7 +243,7 @@ static void neonspam_event_chanmsg_punish(struct ClientSocket *client, struct Ch
                 banmask = generate_banmask(chanuser->user, banmaskBuf);
                 printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chanuser->chan->channel_id, escape_string(banmask), (unsigned long) (punish_time ? (time(0) + punish_time) : 0), 0, escape_string(reason));
                 if(punish_time) {
-                    int banid = (int) mysql_insert_id(mysql_conn);
+                    int banid = (int) mysql_insert_id(get_mysql_conn());
                     char nameBuf[MAXLEN];
                     char banidBuf[20];
                     sprintf(nameBuf, "ban_%d", banid);
index 3b31b926f3461818b995fed1eb207af0ab7eeaf3..5a169f207487c0c702e3752363704a14da9750d4 100644 (file)
@@ -97,7 +97,7 @@ static void neonspam_event_join_punish(struct ClientSocket *client, struct ChanU
                 banmask = generate_banmask(chanuser->user, banmaskBuf);
                 printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chanuser->chan->channel_id, escape_string(banmask), (unsigned long) (duration ? (time(0) + duration) : 0), 0, escape_string(reason));
                 if(duration) {
-                    int banid = (int) mysql_insert_id(mysql_conn);
+                    int banid = (int) mysql_insert_id(get_mysql_conn());
                     char nameBuf[MAXLEN];
                     char banidBuf[20];
                     sprintf(nameBuf, "ban_%d", banid);
index a1b7161f90f9ecf84a8aaca37b88ba9f27592414..4ad2d0d5c0f13626048ecb4833c6f51266be678e 100644 (file)
@@ -136,6 +136,7 @@ main:
     statistics_enabled = get_int_field("statistics.enable");
     
     queue_init();
+    init_sockets();
     init_timeq();
     init_lang();
     ssl_init();
index d3a5ec2d445b4a193030fd042e9b1bae7f3320f6..5002bcd6d0b3391e061be8a7b1ca649f7d9ca64e 100644 (file)
@@ -21,6 +21,7 @@
 #define NEONSERV_VERSION "5.3"
 #define VERSION_PATCHLEVEL 543
 
+#include <features.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -48,8 +49,8 @@
 #define THREAD_MUTEX_INIT(var) { \
     pthread_mutexattr_t mutex_attr; \
     pthread_mutexattr_init(&mutex_attr);\
-    pthread_mutexattr_setkind_np(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\
-    pthread_mutex_init(&var, mutex_attr); \
+    pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);\
+    pthread_mutex_init(&var, &mutex_attr); \
 }
 #define SYNCHRONIZE(var) pthread_mutex_lock(&var)
 #define DESYNCHRONIZE(var) pthread_mutex_unlock(&var)
index ea3c2b89ab4d1042463438d4ce62d5ed97c2dd54..3c3a5a802e62d29b9c97415ad572cf7003de2128 100644 (file)
@@ -20,7 +20,7 @@
 
 struct mysql_conn_struct {
     unsigned long tid;
-    MYSQL *mysql_conn = NULL;
+    MYSQL *mysql_conn;
     struct used_result *used_results;
     struct escaped_string *escaped_strings;
     struct mysql_conn_struct *next;
@@ -271,7 +271,7 @@ struct mysql_conn_struct *get_mysql_conn_struct() {
             return mysql_conn;
         }
     }
-    mysql_conn = malloc(*mysql_conn);
+    mysql_conn = malloc(sizeof(*mysql_conn));
     mysql_conn->mysql_conn = mysql_init(NULL);
     mysql_conn->tid = tid;
     mysql_conn->used_results = NULL;