From df89b4853954b7dcc86839167760cf72af693656 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 12 Sep 2000 06:57:25 +0000 Subject: - fixed some memory leaks in the messages code - added a MSG_PING message for performance testing. (This used to be commit e779f834dbb875669c3aa0a35b324aa13f0c8c36) --- source3/lib/messages.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 927cb095dd..939bf36004 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -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); + } + } +} -- cgit