[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32443] branches/particles-2010/source/ blender: Fixed node dequeueing and command queue cleanup, this fixes memory leaks.
Lukas Toenne
lukas.toenne at googlemail.com
Wed Oct 13 09:57:59 CEST 2010
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. @@
More information about the Bf-blender-cvs
mailing list