Преглед изворни кода

fix race condition, codelets cannot be shared among concurrent starpu_task_inserts since the codelet structure may be modified by _starpu_codelet_check_deprecated_fields

Olivier Aumage пре 8 година
родитељ
комит
87ff32ef0c
1 измењених фајлова са 16 додато и 9 уклоњено
  1. 16 9
      tests/sched_ctx/sched_ctx_hierarchy.c

+ 16 - 9
tests/sched_ctx/sched_ctx_hierarchy.c

@@ -18,7 +18,11 @@
 #include <starpu.h>
 #include "../helper.h"
 
-struct starpu_codelet mycodelet_bis;
+void free_codelet(void *arg)
+{
+	free(arg);
+}
+
 void func_cpu_bis(void *descr[], void *_args)
 {
 	char msg;
@@ -27,6 +31,10 @@ void func_cpu_bis(void *descr[], void *_args)
 	int worker_id_expected;
 	int ntasks;
 
+	struct starpu_codelet *codelet = calloc(1,sizeof(*codelet));
+	codelet->cpu_funcs[0] = func_cpu_bis;
+	codelet->cpu_funcs_name[0] = "func_cpu_bis";
+
 	starpu_worker_get_name(worker_id, worker_name, 256);
 	starpu_codelet_unpack_args(_args, &msg, &ntasks, &worker_id_expected);
 
@@ -36,20 +44,15 @@ void func_cpu_bis(void *descr[], void *_args)
 	if (ntasks > 0)
 	{
 		int nntasks = ntasks - 1;
-		starpu_task_insert(&mycodelet_bis,
+		starpu_task_insert(codelet,
 				   STARPU_VALUE, &msg, sizeof(msg),
 				   STARPU_VALUE, &nntasks, sizeof(ntasks),
 				   STARPU_VALUE, &worker_id, sizeof(worker_id),
+				   STARPU_CALLBACK_WITH_ARG, free_codelet, codelet,
 				   0);
 	}
 }
 
-struct starpu_codelet mycodelet_bis =
-{
-	.cpu_funcs = {func_cpu_bis},
-	.cpu_funcs_name = {"func_cpu_bis"},
-};
-
 void func_cpu(void *descr[], void *_args)
 {
 	char msg;
@@ -59,6 +62,9 @@ void func_cpu(void *descr[], void *_args)
 	int ntasks;
 	unsigned sched_ctx_id;
 	unsigned *sched_ctx_id_p;
+	struct starpu_codelet *codelet = calloc(1,sizeof(*codelet));
+	codelet->cpu_funcs[0] = func_cpu_bis;
+	codelet->cpu_funcs_name[0] = "func_cpu_bis";
 
 	starpu_worker_get_name(worker_id, worker_name, 256);
 	starpu_codelet_unpack_args(_args, &msg, &ntasks, &sched_ctx_id, &worker_id_expected, &sched_ctx_id_p);
@@ -72,10 +78,11 @@ void func_cpu(void *descr[], void *_args)
 	if (ntasks > 0)
 	{
 		int nntasks = ntasks - 1;
-		starpu_task_insert(&mycodelet_bis,
+		starpu_task_insert(codelet,
 				   STARPU_VALUE, &msg, sizeof(msg),
 				   STARPU_VALUE, &nntasks, sizeof(nntasks),
 				   STARPU_VALUE, &worker_id, sizeof(worker_id),
+				   STARPU_CALLBACK_WITH_ARG, free_codelet, codelet,
 				   0);
 	}
 }