Author: tridge
Date: 2004-10-17 11:37:22 +0000 (Sun, 17 Oct 2004)
New Revision: 3017

WebSVN: 
http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=3017&nolog=1

Log:
nicer memory handling for event_context_merge()

Modified:
   branches/SAMBA_4_0/source/include/events.h
   branches/SAMBA_4_0/source/lib/events.c
   branches/SAMBA_4_0/source/libcli/raw/clitransport.c
   branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c


Changeset:
Modified: branches/SAMBA_4_0/source/include/events.h
===================================================================
--- branches/SAMBA_4_0/source/include/events.h  2004-10-17 10:04:49 UTC (rev 3016)
+++ branches/SAMBA_4_0/source/include/events.h  2004-10-17 11:37:22 UTC (rev 3017)
@@ -68,7 +68,8 @@
                int code;
        } exit;
 
-       int ref_count;
+       /* we hang the events off here, to make merging easy */
+       void *events;
 };
 
 

Modified: branches/SAMBA_4_0/source/lib/events.c
===================================================================
--- branches/SAMBA_4_0/source/lib/events.c      2004-10-17 10:04:49 UTC (rev 3016)
+++ branches/SAMBA_4_0/source/lib/events.c      2004-10-17 11:37:22 UTC (rev 3017)
@@ -81,7 +81,7 @@
        /* start off with no events */
        ZERO_STRUCTP(ev);
 
-       ev->ref_count = 1;
+       ev->events = talloc(ev, 0);
 
        return ev;
 }
@@ -91,11 +91,6 @@
 */
 void event_context_destroy(struct event_context *ev)
 {
-       ev->ref_count--;
-       if (ev->ref_count != 0) {
-               return;
-       }
-
        talloc_free(ev);
 }
 
@@ -121,18 +116,18 @@
 
   this is used by modules that need to call on the events of a lower module
 */
-struct event_context * event_context_merge(struct event_context *ev, struct 
event_context *ev2)
+struct event_context *event_context_merge(struct event_context *ev, struct 
event_context *ev2)
 {
        DLIST_CONCATENATE(ev->fd_events, ev2->fd_events, struct fd_event *);
        DLIST_CONCATENATE(ev->timed_events, ev2->timed_events, struct timed_event *);
        DLIST_CONCATENATE(ev->loop_events, ev2->loop_events, struct loop_event *);
 
-       ev->ref_count++;
-
        ev2->fd_events = NULL;
        ev2->timed_events = NULL;
        ev2->loop_events = NULL;
 
+       talloc_steal(ev->events, ev2->events);
+
        event_context_destroy(ev2);
 
        calc_maxfd(ev);
@@ -147,7 +142,7 @@
 */
 struct fd_event *event_add_fd(struct event_context *ev, struct fd_event *e) 
 {
-       e = talloc_memdup(ev, e, sizeof(*e));
+       e = talloc_memdup(ev->events, e, sizeof(*e));
        if (!e) return NULL;
        DLIST_ADD(ev->fd_events, e);
        e->ref_count = 1;
@@ -217,7 +212,7 @@
 */
 struct timed_event *event_add_timed(struct event_context *ev, struct timed_event *e) 
 {
-       e = talloc_memdup(ev, e, sizeof(*e));
+       e = talloc_memdup(ev->events, e, sizeof(*e));
        if (!e) return NULL;
        e->ref_count = 1;
        DLIST_ADD(ev->timed_events, e);
@@ -246,7 +241,7 @@
 */
 struct loop_event *event_add_loop(struct event_context *ev, struct loop_event *e)
 {
-       e = talloc_memdup(ev, e, sizeof(*e));
+       e = talloc_memdup(ev->events, e, sizeof(*e));
        if (!e) return NULL;
        e->ref_count = 1;
        DLIST_ADD(ev->loop_events, e);
@@ -302,7 +297,7 @@
                struct loop_event *next = le->next;
                if (le->ref_count == 0) {
                        DLIST_REMOVE(ev->loop_events, le);
-                       talloc_unlink(ev, le);
+                       talloc_unlink(ev->events, le);
                } else {
                        le->ref_count++;
                        le->handler(ev, le, t);
@@ -323,7 +318,7 @@
                        if (ev->maxfd == fe->fd) {
                                ev->maxfd = EVENT_INVALID_MAXFD;
                        }
-                       talloc_unlink(ev, fe);
+                       talloc_unlink(ev->events, fe);
                } else {
                        if (fe->flags & EVENT_FD_READ) {
                                FD_SET(fe->fd, &r_fds);
@@ -404,7 +399,7 @@
                struct timed_event *next = te->next;
                if (te->ref_count == 0) {
                        DLIST_REMOVE(ev->timed_events, te);
-                       talloc_unlink(ev, te);
+                       talloc_unlink(ev->events, te);
                } else if (te->next_event <= t) {
                        te->ref_count++;
                        te->handler(ev, te, t);

Modified: branches/SAMBA_4_0/source/libcli/raw/clitransport.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/raw/clitransport.c 2004-10-17 10:04:49 UTC (rev 
3016)
+++ branches/SAMBA_4_0/source/libcli/raw/clitransport.c 2004-10-17 11:37:22 UTC (rev 
3017)
@@ -51,7 +51,6 @@
        smbcli_transport_dead(transport);
        event_remove_fd(transport->event.ctx, transport->event.fde);
        event_remove_timed(transport->event.ctx, transport->event.te);
-       event_context_destroy(transport->event.ctx);
        return 0;
 }
 

Modified: branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c     2004-10-17 10:04:49 UTC (rev 
3016)
+++ branches/SAMBA_4_0/source/ntvfs/cifs/vfs_cifs.c     2004-10-17 11:37:22 UTC (rev 
3017)
@@ -138,7 +138,6 @@
        private->transport = private->tree->session->transport;
        private->tree->session->pid = SVAL(req->in.hdr, HDR_PID);
        private->tcon = req->tcon;
-       /*private->ops  = ntvfs_backend_byname("cifs", NTVFS_DISK);*/
 
        tcon->fs_type = talloc_strdup(tcon, "NTFS");
        tcon->dev_type = talloc_strdup(tcon, "A:");
@@ -151,7 +150,8 @@
        private->transport->event.fde->private = private;
 
        private->transport->event.ctx = 
event_context_merge(tcon->smb_conn->connection->event.ctx,
-                                                               
private->transport->event.ctx);
+                                                           
private->transport->event.ctx);
+       talloc_reference(private, private->transport->event.ctx);
 
        return NT_STATUS_OK;
 }

Reply via email to