[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