Revision: 32443
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32443
Author:   lukastoenne
Date:     2010-10-13 09:57:59 +0200 (Wed, 13 Oct 2010)

Log Message:
-----------
Fixed node dequeueing and command queue cleanup, this fixes memory leaks.
Fixed freeing of temporary RNA identifier strings used during loading.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenloader/intern/readfile.c
    
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c
    
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
    
branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c

Modified: branches/particles-2010/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/readfile.c 
2010-10-13 07:43:39 UTC (rev 32442)
+++ branches/particles-2010/source/blender/blenloader/intern/readfile.c 
2010-10-13 07:57:59 UTC (rev 32443)
@@ -2071,8 +2071,10 @@
        /* restore the identifier string */
        rna_data->save_type = newdataadr(fd, (void*)rna_data->save_type);
        rna_data->type = RNA_find_struct(rna_data->save_type);
-       if (rna_data->save_type)
+       if (rna_data->save_type) {
                MEM_freeN((void*)rna_data->save_type);
+               rna_data->save_type = NULL;
+       }
 }
 
 static void direct_link_node_socket_properties(FileData *fd, bNode *node)
@@ -2180,8 +2182,10 @@
                        sock->link= newdataadr(fd, sock->link);
                        sock->contexttype_name= newdataadr(fd, 
(void*)sock->contexttype_name);
                        sock->contexttype = 
RNA_find_struct(sock->contexttype_name);
-                       if (sock->contexttype_name)
+                       if (sock->contexttype_name) {
                                MEM_freeN((void*)sock->contexttype_name);
+                               sock->contexttype_name = NULL;
+                       }
                        sock->storage= newdataadr(fd, sock->storage);
                        sock->panel= newdataadr(fd, sock->panel);
                }
@@ -2189,8 +2193,10 @@
                        sock->ns.data= NULL;
                        sock->contexttype_name= newdataadr(fd, 
(void*)sock->contexttype_name);
                        sock->contexttype = 
RNA_find_struct(sock->contexttype_name);
-                       if (sock->contexttype_name)
+                       if (sock->contexttype_name) {
                                MEM_freeN((void*)sock->contexttype_name);
+                               sock->contexttype_name = NULL;
+                       }
                        sock->storage= newdataadr(fd, sock->storage);
                        sock->panel= newdataadr(fd, sock->panel);
                }

Modified: 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c
===================================================================
--- 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c   
    2010-10-13 07:43:39 UTC (rev 32442)
+++ 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c   
    2010-10-13 07:57:59 UTC (rev 32443)
@@ -95,33 +95,28 @@
        {
                if (sock->data) {
                        MEM_freeN(sock->data);
+                       sock->data = NULL;
                }
        }
 }
 
 void sim_event_init(SimEvent *event)
 {
-       event->impl = MEM_callocN(sizeof(SimJobEvent), "SimJobEvent");
-       event->impl->status = SIM_QUEUED;
+       event->status = SIM_QUEUED;
+       event->refcount = 0;
 }
 
-void sim_event_free(SimEvent *event)
+void sim_event_retain(SimEvent *event)
 {
-       if (event->impl)
-               MEM_freeN(event->impl);
+       ++event->refcount;
 }
 
-int sim_event_compare(SimEvent *a, SimEvent *b)
+void sim_event_release(SimEvent *event)
 {
-#ifdef WITH_OPENCL
-       if (BKE_opencl_is_active()) {
-               return (a->impl_cl == b->impl_cl);
+       --event->refcount;
+       if (event->refcount <= 0) {
+               MEM_freeN(event);
        }
-       else
-#endif
-       {
-               return (a->impl == b->impl);
-       }
 }
 
 SimEventStatus sim_event_status(SimEvent *event)
@@ -135,7 +130,7 @@
        else
 #endif
        {
-               return event->impl->status;
+               return event->status;
        }
 }
 
@@ -154,7 +149,7 @@
        *num_events = BLI_countlist(events);
        *events_cl = MEM_callocN((*num_events) * sizeof(cl_event), "events_cl");
        for (link=events->first, i=0; link; link=link->next, ++i) {
-               (*events_cl)[i] = link->event.impl_cl;
+               (*events_cl)[i] = link->event->impl_cl;
        }
 }
 #endif
@@ -168,38 +163,40 @@
        job->workgroupsize = (workgroupsize > 0 ? workgroupsize : 
execdata->default_workgroupsize);
        job->startitem = 0;
        BLI_duplicatelist(&job->wait_events, wait_events);
-       sim_event_init(&job->event);
-       if (event_list)
-               sim_eventlist_append(event_list, &job->event);
        
+       job->event = MEM_callocN(sizeof(SimEvent), "SimEvent");
+       sim_event_init(job->event);
+       sim_event_retain(job->event);
        if (sim_eventlist_status(&job->wait_events)==SIM_COMPLETE)
-               job->event.impl->status = SIM_SUBMITTED;
+               job->event->status = SIM_SUBMITTED;
        else
-               job->event.impl->status = SIM_QUEUED;
-       BLI_addtail(&execdata->queue, job);
+               job->event->status = SIM_QUEUED;
+       if (event_list)
+               sim_eventlist_append(event_list, job->event);
        
+       BLI_addtail(&execdata->queue, job);
        pthread_cond_signal(&execdata->workercond);
        
        return job;
 }
 
+void sim_dequeue_job(SimExecData *execdata, SimJob *job)
+{
+       BLI_remlink(&execdata->queue, job);
+       sim_event_release(job->event);
+       sim_eventlist_free(&job->wait_events);
+       if (job->data)
+               MEM_freeN(job->data);
+       MEM_freeN(job);
+}
+
 void sim_finish_job(SimExecData *execdata, SimJob *job)
 {
-       job->event.impl->status = SIM_COMPLETE;
+       job->event->status = SIM_COMPLETE;
        for (job=job->next; job; job = job->next) {
-               if (sim_event_status(&job->event) == SIM_QUEUED && 
sim_eventlist_status(&job->wait_events)==SIM_COMPLETE) {
+               if (sim_event_status(job->event) == SIM_QUEUED && 
sim_eventlist_status(&job->wait_events)==SIM_COMPLETE) {
                        /* activate the job */
-                       job->event.impl->status = SIM_SUBMITTED;
+                       job->event->status = SIM_SUBMITTED;
                }
        }
 }
-
-void sim_free_job(SimExecData *execdata, SimJob *job)
-{
-       BLI_remlink(&execdata->queue, job);
-       sim_event_free(&job->event);
-       BLI_freelistN(&job->wait_events);
-       if (job->data)
-               MEM_freeN(job->data);
-       MEM_freeN(job);
-}

Modified: 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
===================================================================
--- 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h   
    2010-10-13 07:43:39 UTC (rev 32442)
+++ 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h   
    2010-10-13 07:57:59 UTC (rev 32443)
@@ -65,12 +65,14 @@
        #ifdef WITH_OPENCL
        cl_event impl_cl;
        #endif
-       struct SimJobEvent *impl;
+       /* only used in non-OpenCL mode */
+       SimEventStatus status;
+       int refcount;
 } SimEvent;
 
 typedef struct SimEventLink {
        struct SimEventLink *next, *prev;
-       struct SimEvent event;
+       struct SimEvent *event;
 } SimEventLink;
 
 typedef void (*SimJobFunction)(void *data, int start, int total);
@@ -79,7 +81,7 @@
        int active;                                             /* number of 
threads working on this task */
        
        ListBase wait_events;
-       SimEvent event;
+       SimEvent *event;
        
        int totitems, workgroupsize;
        int startitem;                                  /* starting index for 
the next worker thread */
@@ -88,10 +90,6 @@
        SimJobFunction execfunc;
 } SimJob;
 
-typedef struct SimJobEvent {
-       SimEventStatus status;
-} SimJobEvent;
-
 typedef struct SimWorkerThread {
        struct SimExecData *execdata;
        int num;
@@ -101,8 +99,8 @@
 void sim_free_socket_buffer(struct SimExecData *execdata, struct 
SimSocketStack *sock);
 
 void sim_event_init(struct SimEvent *event);
-void sim_event_free(struct SimEvent *event);
-int sim_event_compare(struct SimEvent *a, struct SimEvent *b);
+void sim_event_retain(struct SimEvent *event);
+void sim_event_release(struct SimEvent *event);
 SimEventStatus sim_event_status(struct SimEvent *event);
 
 #ifdef WITH_OPENCL
@@ -110,8 +108,8 @@
 #endif
 
 struct SimJob *sim_enqueue_job(struct SimExecData *execdata, SimJobFunction 
execfunc, void *data, int totitems, int workgroupsize, struct ListBase 
*wait_events, struct ListBase *event_list);
+void sim_dequeue_job(struct SimExecData *execdata, struct SimJob *job);
 void sim_finish_job(struct SimExecData *execdata, struct SimJob *job);
-void sim_free_job(struct SimExecData *execdata, struct SimJob *job);
 
 BM_INLINE void print_event_list(struct ListBase *lb)
 {
@@ -119,7 +117,7 @@
        int i;
        for (i=0, link=lb->first; link; ++i, link=link->next) {
                printf("\t%d. ", i);
-               switch (link->event.impl->status) {
+               switch (link->event->status) {
                case SIM_QUEUED:        printf("queued");               break;
                case SIM_SUBMITTED:     printf("submitted");    break;
                case SIM_RUNNING:       printf("running");              break;

Modified: 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c   
2010-10-13 07:43:39 UTC (rev 32442)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c   
2010-10-13 07:57:59 UTC (rev 32443)
@@ -214,7 +214,8 @@
 void sim_eventlist_append(ListBase *lb, SimEvent *event)
 {
        SimEventLink *link = MEM_callocN(sizeof(SimEventLink), "SimEventLink");
-       link->event = *event;
+       link->event = event;
+       sim_event_retain(event);
        BLI_addtail(lb, link);
 }
 
@@ -224,19 +225,33 @@
        
        /* note: there is also the addlisttolist function, but we want to copy 
the 'append' list instead of just attaching it to lb! */
        for (link=append->first; link; link=link->next)
-               sim_eventlist_append(lb, &link->event);
+               sim_eventlist_append(lb, link->event);
 }
 
 void sim_eventlist_remove(ListBase *lb, SimEvent *event)
 {
-       SimEventLink *link;
-       for (link=lb->first; link; link=link->next) {
-               if (sim_event_compare(&link->event, event)) {
+       SimEventLink *link, *nextlink;
+       for (link=lb->first; link; link=nextlink) {
+               nextlink = link->next;
+               if (link->event == event) {
                        BLI_remlink(lb, link);
+                       sim_event_release(link->event);
+                       MEM_freeN(link);
                }
        }
 }
 
+void sim_eventlist_free(ListBase *lb)
+{
+       SimEventLink *link, *nextlink;
+       for (link=lb->first; link; link=nextlink) {
+               nextlink = link->next;
+               sim_event_release(link->event);
+               MEM_freeN(link);
+       }
+       lb->first = lb->last = NULL;
+}
+
 BM_INLINE int event_status_less(SimEventStatus a, SimEventStatus b)
 {
        if (b==SIM_QUEUED)
@@ -254,8 +269,8 @@
        SimEventStatus status = SIM_COMPLETE;
        SimEventLink *link;
        for (link=lb->first; link; link=link->next) {
-               if (event_status_less(sim_event_status(&link->event), status))
-                       status = sim_event_status(&link->event);
+               if (event_status_less(sim_event_status(link->event), status))
+                       status = sim_event_status(link->event);
        }
        return status;
 }

Modified: 
branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h   
2010-10-13 07:43:39 UTC (rev 32442)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h   
2010-10-13 07:57:59 UTC (rev 32443)
@@ -149,11 +149,6 @@
        
        ListBase events;
        ListBase inputevents;
-       
-//     SimEvent outputevent;
-       
-//     struct SimEvent *inputevents;           /* list of input events */
-//     int totinputevents;
 } SimNodeStack;
 
 typedef struct SimNodeOperator {
@@ -216,6 +211,7 @@
 void sim_eventlist_append(struct ListBase *lb, struct SimEvent *event);
 void sim_eventlist_append_list(struct ListBase *lb, struct ListBase *append);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to