[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-262-g6f1f9f6

Andrew Tridgell tridge at samba.org
Tue Mar 10 05:46:55 GMT 2009


The branch, master has been updated
       via  6f1f9f6d8d3d25ab6ed5467b81f1eed70e962d27 (commit)
      from  a67bc41d6bc25974e6aa6d864d5265d07c890413 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6f1f9f6d8d3d25ab6ed5467b81f1eed70e962d27
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Mar 10 16:45:45 2009 +1100

    fixed a bug in message handling for code the change notify code
    
    The change notify code registered a separate message handler for each
    tree connect. This registration uses the global messaging context.
    
    The messaging code would consider a 2nd registration for the same
    messaging type as being an 'update' of the handler, rather than a new
    handler. It also would only call the first handler in the linked list
    for a given message type when dispatching messages.
    
    This patch changes the messaging code to allow for multiple
    registrations of the same message type, and allow for multiple calls
    to different messaging handler for one incoming message.
    
    This fixes the problem with the test_notify_tcon() test that I
    recently committed to the S4 smbtorture

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/messages.c |   18 ++++++++++++++++--
 1 files changed, 16 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index e4b20c7..5e11dd4 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -286,7 +286,15 @@ NTSTATUS messaging_register(struct messaging_context *msg_ctx,
 	 */
 
 	for (cb = msg_ctx->callbacks; cb != NULL; cb = cb->next) {
-		if (cb->msg_type == msg_type) {
+		/* we allow a second registration of the same message
+		   type if it has a different private pointer. This is
+		   needed in, for example, the internal notify code,
+		   which creates a new notify context for each tree
+		   connect, and expects to receive messages to each of
+		   them. */
+		if (cb->msg_type == msg_type && private_data == cb->private_data) {
+			DEBUG(5,("Overriding messaging pointer for type %u - private_data=%p\n",
+				  (unsigned)msg_type, private_data));
 			cb->fn = fn;
 			cb->private_data = private_data;
 			return NT_STATUS_OK;
@@ -317,6 +325,8 @@ void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type,
 		next = cb->next;
 		if ((cb->msg_type == msg_type)
 		    && (cb->private_data == private_data)) {
+			DEBUG(5,("Deregistering messaging pointer for type %u - private_data=%p\n",
+				  (unsigned)msg_type, private_data));
 			DLIST_REMOVE(ctx->callbacks, cb);
 			TALLOC_FREE(cb);
 		}
@@ -362,7 +372,11 @@ void messaging_dispatch_rec(struct messaging_context *msg_ctx,
 		if (cb->msg_type == rec->msg_type) {
 			cb->fn(msg_ctx, cb->private_data, rec->msg_type,
 			       rec->src, &rec->buf);
-			return;
+			/* we continue looking for matching messages
+			   after finding one. This matters for
+			   subsystems like the internal notify code
+			   which register more than one handler for
+			   the same message type */
 		}
 	}
 	return;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list