Author: metze
Date: 2006-04-12 15:52:17 +0000 (Wed, 12 Apr 2006)
New Revision: 15055

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15055

Log:
this was my version for the crash bug in the messaging code...
it also makes the function a bit shorter and clearer,
as the tmp msg_types only have one handler and not a list

metze
Modified:
   branches/SAMBA_4_0/source/lib/messaging/messaging.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/messaging/messaging.c
===================================================================
--- branches/SAMBA_4_0/source/lib/messaging/messaging.c 2006-04-12 14:11:51 UTC 
(rev 15054)
+++ branches/SAMBA_4_0/source/lib/messaging/messaging.c 2006-04-12 15:52:17 UTC 
(rev 15055)
@@ -299,8 +299,7 @@
                msg->num_types = msg_type+1;
        }
 
-
-       d = talloc(msg->dispatch, struct dispatch_fn);
+       d = talloc_zero(msg->dispatch, struct dispatch_fn);
        NT_STATUS_HAVE_NO_MEMORY(d);
        d->msg_type = msg_type;
        d->private = private;
@@ -343,37 +342,25 @@
 */
 void messaging_deregister(struct messaging_context *msg, uint32_t msg_type, 
void *private)
 {
-       struct dispatch_fn *d, *list, *next;
+       struct dispatch_fn *d, *next;
 
        if (msg_type >= msg->num_types) {
-               list = idr_find(msg->dispatch_tree, msg_type);
-       } else {
-               list = msg->dispatch[msg_type];
-       }
-
-       if (list == NULL) {
+               d = idr_find(msg->dispatch_tree, msg_type);
+               if (!d) return;
+               idr_remove(msg->dispatch_tree, msg_type);
+               talloc_free(d);
                return;
        }
 
-       for (d = list; d; d = next) {
+       for (d = msg->dispatch[msg_type]; d; d = next) {
                next = d->next;
                if (d->private == private) {
-                       DLIST_REMOVE(list, d);
+                       DLIST_REMOVE(msg->dispatch[msg_type], d);
                        talloc_free(d);
                }
-       }       
-
-       /* the list base possibly changed */
-       if (msg_type >= msg->num_types) {
-               if (list == NULL) {
-                       idr_remove(msg->dispatch_tree, msg_type);
-               }
-       } else {
-               msg->dispatch[msg_type] = list;
        }
 }
 
-
 /*
   Send a message to a particular server
 */

Reply via email to