[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32370] branches/particles-2010/source/ blender: couple of bugfixes, notably fixed memory corruption by wrong pointers when using direct buffer iteration (get/set data nodes) and faulty save function for node trees.

Lukas Toenne lukas.toenne at googlemail.com
Fri Oct 8 09:24:36 CEST 2010


Revision: 32370
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32370
Author:   lukastoenne
Date:     2010-10-08 09:24:35 +0200 (Fri, 08 Oct 2010)

Log Message:
-----------
couple of bugfixes, notably fixed memory corruption by wrong pointers when using direct buffer iteration (get/set data nodes) and faulty save function for node trees.
replaced ocl-style event arrays by dynamic lists for easier handling by node coders (these are converted to cl_event arrays internally when enqueueing).

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenloader/intern/writefile.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
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_set_data.c

Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-10-08 03:50:01 UTC (rev 32369)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-10-08 07:24:35 UTC (rev 32370)
@@ -510,12 +510,12 @@
 		
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);
-			if (node->storage)
+			if (sock->storage)
 				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}
 		for(sock= node->outputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);
-			if (node->storage)
+			if (sock->storage)
 				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}
 		if (node->type==SIM_NODE_GETDATA || node->type==SIM_NODE_SETDATA)

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-08 03:50:01 UTC (rev 32369)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c	2010-10-08 07:24:35 UTC (rev 32370)
@@ -45,28 +45,67 @@
 
 #include "RNA_access.h"
 
-void sim_init_event(SimEvent *event)
+void sim_event_init(SimEvent *event)
 {
 	event->impl = MEM_callocN(sizeof(SimTaskEvent), "SimTaskEvent");
 	event->impl->status = SIM_QUEUED;
 }
 
-void sim_free_event(SimEvent *event)
+void sim_event_free(SimEvent *event)
 {
 	if (event->impl)
 		MEM_freeN(event->impl);
 }
 
-static int task_ready(SimTask *task)
+int sim_event_compare(SimEvent *a, SimEvent *b)
 {
+#ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		return (a->impl_cl == b->impl_cl);
+	}
+	else
+#endif
+	{
+		return (a->impl == b->impl);
+	}
+}
+
+SimEventStatus sim_event_status(SimEvent *event)
+{
+#ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		cl_int status;
+		clGetEventInfo(event->impl_cl, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, NULL);
+		return status;
+	}
+	else
+#endif
+	{
+		return event->impl->status;
+	}
+}
+
+#ifdef WITH_OPENCL
+void sim_create_cl_event_list(ListBase *events, int *num_events, cl_event **events_cl)
+{
 	int i;
-	for (i=0; i < task->num_wait_events; ++i)
-		if (sim_get_event_status(task->wait_events + i) != SIM_COMPLETE)
-			break;
-	return (i >= task->num_wait_events);
+	SimEventLink *link;
+	
+	if (events->first == NULL) {
+		*num_events = 0;
+		*events_cl = NULL;
+		return;
+	}
+	
+	*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;
+	}
 }
+#endif
 
-SimTask *sim_enqueue_task(SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, int num_wait_events, SimEvent *wait_events, SimEvent *event)
+SimTask *sim_enqueue_task(SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, ListBase *wait_events, ListBase *event_list)
 {
 	SimTask *task= MEM_callocN(sizeof(SimTask), "SimTask");
 	task->data = data;
@@ -74,18 +113,12 @@
 	task->totitems = totitems;
 	task->workgroupsize = (workgroupsize > 0 ? workgroupsize : execdata->default_workgroupsize);
 	task->startitem = 0;
-	task->num_wait_events = num_wait_events;
-	if (num_wait_events > 0) {
-		task->wait_events = MEM_callocN(num_wait_events*sizeof(SimEvent), "wait events");
-		memcpy(task->wait_events, wait_events, num_wait_events*sizeof(SimEvent));
-	}
-	else
-		task->wait_events = NULL;
-	sim_init_event(&task->event);
-	if (event)
-		*event = task->event;
+	BLI_duplicatelist(&task->wait_events, wait_events);
+	sim_event_init(&task->event);
+	if (event_list)
+		sim_eventlist_append(event_list, &task->event);
 	
-	if (task_ready(task))
+	if (sim_eventlist_status(&task->wait_events)==SIM_COMPLETE)
 		task->event.impl->status = SIM_SUBMITTED;
 	else
 		task->event.impl->status = SIM_QUEUED;
@@ -100,7 +133,7 @@
 {
 	task->event.impl->status = SIM_COMPLETE;
 	for (task=task->next; task; task = task->next) {
-		if (sim_get_event_status(&task->event) == SIM_QUEUED && task_ready(task)) {
+		if (sim_event_status(&task->event) == SIM_QUEUED && sim_eventlist_status(&task->wait_events)==SIM_COMPLETE) {
 			/* activate the task */
 			task->event.impl->status = SIM_SUBMITTED;
 		}
@@ -110,27 +143,9 @@
 void sim_free_task(SimExecData *execdata, SimTask *task)
 {
 	BLI_remlink(&execdata->queue, task);
-	sim_free_event(&task->event);
-	if (task->wait_events)
-		MEM_freeN(task->wait_events);
+	sim_event_free(&task->event);
+	BLI_freelistN(&task->wait_events);
 	if (task->data)
 		MEM_freeN(task->data);
 	MEM_freeN(task);
 }
-
-#ifdef WITH_OPENCL
-cl_event *sim_create_cl_event_list(int num_events, struct SimEvent *events)
-{
-	
-	if (num_events > 0) {
-		cl_event *events_cl;
-		int i;
-		events_cl = MEM_callocN(num_events * sizeof(cl_event), "events_cl");
-		for (i=0; i < num_events; ++i)
-			events_cl[i] = events[i].impl_cl;
-		return events_cl;
-	}
-	else
-		return NULL;
-}
-#endif

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-08 03:50:01 UTC (rev 32369)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h	2010-10-08 07:24:35 UTC (rev 32370)
@@ -61,6 +61,18 @@
 
 struct SimExecData;
 
+typedef struct SimEvent {
+	#ifdef WITH_OPENCL
+	cl_event impl_cl;
+	#endif
+	struct SimTaskEvent *impl;
+} SimEvent;
+
+typedef struct SimEventLink {
+	struct SimEventLink *next, *prev;
+	struct SimEvent event;
+} SimEventLink;
+
 typedef struct SimTaskEvent {
 	SimEventStatus status;
 } SimTaskEvent;
@@ -70,8 +82,7 @@
 	struct SimTask *next, *prev;
 	int active;						/* number of threads working on this task */
 	
-	SimEvent *wait_events;
-	int num_wait_events;
+	ListBase wait_events;
 	SimEvent event;
 	
 	int totitems, workgroupsize;
@@ -86,15 +97,17 @@
 	int num;
 } SimWorkerThread;
 
-void sim_init_event(struct SimEvent *event);
-void sim_free_event(struct SimEvent *event);
+void sim_event_init(struct SimEvent *event);
+void sim_event_free(struct SimEvent *event);
+int sim_event_compare(struct SimEvent *a, struct SimEvent *b);
+SimEventStatus sim_event_status(struct SimEvent *event);
 
-struct SimTask *sim_enqueue_task(struct SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, int num_wait_events, struct SimEvent *wait_events, struct SimEvent *event);
+#ifdef WITH_OPENCL
+void sim_create_cl_event_list(struct ListBase *events, int *num_events, cl_event **events_cl);
+#endif
+
+struct SimTask *sim_enqueue_task(struct SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, struct ListBase *wait_events, struct ListBase *event_list);
 void sim_finish_task(struct SimExecData *execdata, struct SimTask *task);
 void sim_free_task(struct SimExecData *execdata, struct SimTask *task);
 
-#ifdef WITH_OPENCL
-cl_event *sim_create_cl_event_list(int num_events, struct SimEvent *events);
 #endif
-
-#endif

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-08 03:50:01 UTC (rev 32369)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-08 07:24:35 UTC (rev 32370)
@@ -184,18 +184,13 @@
 void sim_context_create(Scene *scene, PointerRNA *ptr, PropertyRNA *prop, int key, SimDataContext *r_ctx)
 {
 	r_ctx->scene = scene;
-	if (ptr && ptr->data && ptr->type) {
+	if (ptr)
 		r_ctx->ptr = *ptr;
-		r_ctx->prop = prop;
-		r_ctx->key = key;
-		context_update_size(r_ctx);
-	}
-	else {
+	else
 		RNA_pointer_create(NULL, NULL, NULL, &r_ctx->ptr);
-		r_ctx->prop = NULL;
-		r_ctx->key = 0;
-		r_ctx->size = 0;
-	}
+	r_ctx->prop = prop;
+	r_ctx->key = key;
+	context_update_size(r_ctx);
 }
 
 StructRNA *sim_context_type(SimDataContext *ctx)
@@ -310,36 +305,48 @@
 	return 1;
 }
 
-SimEventStatus sim_get_event_status(SimEvent *event)
+void sim_eventlist_append(ListBase *lb, SimEvent *event)
 {
-#ifdef WITH_OPENCL
-	if (BKE_opencl_is_active()) {
-		cl_int status;
-		clGetEventInfo(event->impl_cl, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(cl_int), &status, NULL);
-		return status;
+	SimEventLink *link = MEM_callocN(sizeof(SimEventLink), "SimEventLink");
+	link->event = *event;
+	BLI_addtail(lb, link);
+}
+
+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)) {
+			BLI_remlink(lb, link);
+		}
 	}
-	else
-#endif
-	{
-		return event->impl->status;
+}
+
+void sim_eventlist_merge(ListBase *lb, ListBase *merge)
+{
+	addlisttolist(lb, merge);
+}
+
+SimEventStatus sim_eventlist_status(ListBase *lb)
+{
+	SimEventStatus status = SIM_COMPLETE;
+	SimEventLink *link;
+	for (link=lb->first; link; link=link->next) {
+		if (sim_event_status(&link->event) < status)
+			status = sim_event_status(&link->event);
 	}
+	return status;
 }
 
-void sim_wait_for_events(SimExecData *execdata, int num_wait_events, struct SimEvent *wait_events)
+void sim_wait_for_events(SimExecData *execdata, struct ListBase *wait_events)
 {
 #ifdef WITH_OPENCL
 	if (BKE_opencl_is_active()) {
 		cl_int res;
+		int num_wait_events;
 		cl_event *wait_events_cl;
 		
-		if (num_wait_events > 0) {
-			int i;
-			wait_events_cl = MEM_callocN(num_wait_events * sizeof(cl_event), "wait_events_cl");
-			for (i=0; i < num_wait_events; ++i)
-				wait_events_cl[i] = wait_events[i].impl_cl;
-		}
-		else
-			wait_events_cl = NULL;
+		sim_create_cl_event_list(wait_events, &num_wait_events, &wait_events_cl);
 		res = clWaitForEvents(num_wait_events, wait_events_cl);
 		MEM_freeN(wait_events_cl);
 		if (res != CL_SUCCESS) {
@@ -350,16 +357,8 @@
 	else
 #endif
 	{
-		int i, all_complete;
 		while (1) {
-			all_complete = 1;
-			for (i=0; i < num_wait_events; ++i) {
-				if (sim_get_event_status(wait_events + i) != SIM_COMPLETE) {
-					all_complete = 0;
-					break;
-				}
-			}
-			if (all_complete)
+			if (sim_eventlist_status(wait_events)==SIM_COMPLETE)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list