Browse Source

insert_task: new internal function _starpu_task_insert_v which takes a
varg_list and calls va_copy to browse the list several times. all
functions using a varg_list no longer call va_end themselves, it
should be called outside the function.

Nathalie Furmento 11 years ago
parent
commit
67ad578ac7

+ 6 - 1
mpi/src/starpu_mpi_task_insert.c

@@ -586,16 +586,17 @@ int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...)
 		/* Get the number of buffers and the size of the arguments */
 		va_start(varg_list, codelet);
 		arg_buffer_size = _starpu_task_insert_get_arg_size(varg_list);
+		va_end(varg_list);
 
 		/* Pack arguments if needed */
 		if (arg_buffer_size)
 		{
 			va_start(varg_list, codelet);
 			_starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list);
+			va_end(varg_list);
 		}
 
 		_STARPU_MPI_DEBUG(1, "Execution of the codelet %p (%s)\n", codelet, codelet->name);
-		va_start(varg_list, codelet);
 
 		struct starpu_task *task = starpu_task_create();
 		task->cl_arg_free = 1;
@@ -604,7 +605,11 @@ int starpu_mpi_task_insert(MPI_Comm comm, struct starpu_codelet *codelet, ...)
 		{
 			task->dyn_handles = malloc(codelet->nbuffers * sizeof(starpu_data_handle_t));
 		}
+
+		va_start(varg_list, codelet);
 		int ret = _starpu_task_insert_create_and_submit(arg_buffer, arg_buffer_size, codelet, &task, varg_list);
+		va_end(varg_list);
+
 		STARPU_ASSERT_MSG(ret==0, "_starpu_task_insert_create_and_submit failure %d", ret);
 	}
 

+ 28 - 8
src/util/starpu_task_insert.c

@@ -30,9 +30,11 @@ void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...)
 	/* Compute the size */
 	va_start(varg_list, arg_buffer_size);
 	*arg_buffer_size = _starpu_task_insert_get_arg_size(varg_list);
+	va_end(varg_list);
 
 	va_start(varg_list, arg_buffer_size);
 	_starpu_codelet_pack_args(arg_buffer, *arg_buffer_size, varg_list);
+	va_end(varg_list);
 }
 
 void starpu_codelet_unpack_args(void *_cl_arg, ...)
@@ -62,20 +64,24 @@ void starpu_codelet_unpack_args(void *_cl_arg, ...)
 	va_end(varg_list);
 }
 
-int starpu_task_insert(struct starpu_codelet *cl, ...)
+int _starpu_task_insert_v(struct starpu_codelet *cl, va_list varg_list)
 {
-	va_list varg_list;
 	void *arg_buffer = NULL;
+	va_list varg_list_copy;
+	int ret;
 
 	/* Compute the size */
 	size_t arg_buffer_size = 0;
-	va_start(varg_list, cl);
-	arg_buffer_size = _starpu_task_insert_get_arg_size(varg_list);
+
+	va_copy(varg_list_copy, varg_list);
+	arg_buffer_size = _starpu_task_insert_get_arg_size(varg_list_copy);
+	va_end(varg_list);
 
 	if (arg_buffer_size)
 	{
-		va_start(varg_list, cl);
-		_starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list);
+		va_copy(varg_list_copy, varg_list);
+		_starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list_copy);
+		va_end(varg_list_copy);
 	}
 
 	struct starpu_task *task = starpu_task_create();
@@ -86,8 +92,9 @@ int starpu_task_insert(struct starpu_codelet *cl, ...)
 		task->dyn_handles = malloc(cl->nbuffers * sizeof(starpu_data_handle_t));
 	}
 
-	va_start(varg_list, cl);
-	int ret = _starpu_task_insert_create_and_submit(arg_buffer, arg_buffer_size, cl, &task, varg_list);
+	va_copy(varg_list_copy, varg_list);
+	ret = _starpu_task_insert_create_and_submit(arg_buffer, arg_buffer_size, cl, &task, varg_list_copy);
+	va_end(varg_list_copy);
 
 	if (ret == -ENODEV)
 	{
@@ -97,6 +104,17 @@ int starpu_task_insert(struct starpu_codelet *cl, ...)
 	return ret;
 }
 
+int starpu_task_insert(struct starpu_codelet *cl, ...)
+{
+	va_list varg_list;
+	int ret;
+
+	va_start(varg_list, cl);
+	ret = _starpu_task_insert_v(cl, varg_list);
+	va_end(varg_list);
+	return ret;
+}
+
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...)
 {
 	va_list varg_list;
@@ -106,11 +124,13 @@ struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...)
 	size_t arg_buffer_size = 0;
 	va_start(varg_list, cl);
 	arg_buffer_size = _starpu_task_insert_get_arg_size(varg_list);
+	va_end(varg_list);
 
 	if (arg_buffer_size)
 	{
 		va_start(varg_list, cl);
 		_starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list);
+		va_end(varg_list);
 	}
 
 	struct starpu_task *task = starpu_task_create();

+ 0 - 4
src/util/starpu_task_insert_utils.c

@@ -122,7 +122,6 @@ size_t _starpu_task_insert_get_arg_size(va_list varg_list)
 		}
 	}
 
-	va_end(varg_list);
 	return arg_buffer_size;
 }
 
@@ -230,7 +229,6 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 	}
 
 	*arg_buffer = _arg_buffer;
-	va_end(varg_list);
 	return 0;
 }
 
@@ -365,8 +363,6 @@ void _starpu_task_insert_create(void *arg_buffer, size_t arg_buffer_size, struct
 		}
 	}
 
-	va_end(varg_list);
-
 	STARPU_ASSERT(cl == NULL || current_buffer == cl->nbuffers);
 
 	(*task)->cl = cl;