- fixed some memory leaks in the messages code
authorAndrew Tridgell <tridge@samba.org>
Tue, 12 Sep 2000 06:57:25 +0000 (06:57 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 12 Sep 2000 06:57:25 +0000 (06:57 +0000)
- added a MSG_PING message for performance testing.
(This used to be commit e779f834dbb875669c3aa0a35b324aa13f0c8c36)

source3/include/messages.h
source3/lib/messages.c
source3/utils/msgtest.c

index 6ab21e7433300e87e7bfc214f4be92b0c72bd338..8433866f9e21daf73bac1eea96611b382c2c633f 100644 (file)
@@ -25,6 +25,7 @@
 /* general messages */
 #define MSG_DEBUG 1
 #define MSG_PING  2
+#define MSG_PONG  3
 
 /* nmbd messages */
 #define MSG_FORCE_ELECTION 1001
index 927cb095ddf8b0420a7c52ce4d1379fc5e1c27be..939bf36004f1be7884b68ed9f44b91674b1b6400 100644 (file)
@@ -65,6 +65,14 @@ static void sig_usr1(void)
        sys_select_signal();
 }
 
+/****************************************************************************
+a useful function for testing the message system
+****************************************************************************/
+void ping_message(int msg_type, pid_t src, void *buf, size_t len)
+{
+       message_send_pid(src, MSG_PONG, buf, len);
+}
+
 /****************************************************************************
  Initialise the messaging functions. 
 ****************************************************************************/
@@ -83,6 +91,8 @@ BOOL message_init(void)
 
        CatchSignal(SIGUSR1, sig_usr1);
 
+       message_register(MSG_PING, ping_message);
+
        return True;
 }
 
@@ -167,11 +177,11 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len)
        memcpy(p+dbuf.dsize, &rec, sizeof(rec));
        if (len > 0) memcpy(p+dbuf.dsize+sizeof(rec), buf, len);
 
+       free(dbuf.dptr);
        dbuf.dptr = p;
        dbuf.dsize += len + sizeof(rec);
        tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
        free(dbuf.dptr);
-       free(p);
 
  ok:
        tdb_unlockchain(tdb, kbuf);
@@ -256,6 +266,7 @@ void message_dispatch(void)
                                dfn->fn(msg_type, src, buf, len);
                        }
                }
+               if (buf) free(buf);
        }
 }
 
@@ -277,3 +288,19 @@ void message_register(int msg_type,
 
        DLIST_ADD(dispatch_fns, dfn);
 }
+
+/****************************************************************************
+de-register the function for a particular message type
+****************************************************************************/
+void message_deregister(int msg_type)
+{
+       struct dispatch_fns *dfn, *next;
+
+       for (dfn = dispatch_fns; dfn; dfn = next) {
+               next = dfn->next;
+               if (dfn->msg_type == msg_type) {
+                       DLIST_REMOVE(dispatch_fns, dfn);
+                       free(dfn);
+               }
+       }       
+}
index 22d7a9a331d7a34a917c560f246fbd9c616454e8..4821aef80bf79bc0a813759bd5fd5b9a6603bca8 100644 (file)
 
 #include "includes.h"
 
+static int pong_count;
+
+/****************************************************************************
+a useful function for testing the message system
+****************************************************************************/
+void pong_message(int msg_type, pid_t src, void *buf, size_t len)
+{
+       pong_count++;
+}
 
 
  int main(int argc, char *argv[])
 {
        pid_t pid;
-       int level;
+       int i, n;
        static pstring servicesf = CONFIGFILE;
 
        TimeInit();
        message_init();
 
        pid = atoi(argv[1]);
-       level = atoi(argv[2]);
+       n = atoi(argv[2]);
+
+       message_register(MSG_PONG, pong_message);
+
+       for (i=0;i<n;i++) {
+               message_send_pid(pid, MSG_PING, NULL, 0);
+       }
 
-       message_send_pid(pid, MSG_FORCE_ELECTION, NULL, 0);
+       while (pong_count < n) {
+               message_dispatch();
+               msleep(1);
+       }
 
        return (0);
 }