[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