浏览代码

src/util: store the number of task value arguments as an int, a char could be too small

Nathalie Furmento 10 年之前
父节点
当前提交
ab662bbb8e
共有 2 个文件被更改,包括 19 次插入19 次删除
  1. 11 10
      src/util/starpu_task_insert.c
  2. 8 9
      src/util/starpu_task_insert_utils.c

+ 11 - 10
src/util/starpu_task_insert.c

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2010, 2012, 2014  Université de Bordeaux
- * Copyright (C) 2011, 2012, 2013  Centre National de la Recherche Scientifique
+ * Copyright (C) 2011, 2012, 2013, 2014  Centre National de la Recherche Scientifique
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -39,25 +39,27 @@ void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...)
 
 void starpu_codelet_unpack_args(void *_cl_arg, ...)
 {
-	unsigned char *cl_arg = (unsigned char *) _cl_arg;
-	unsigned current_arg_offset = 0;
+	char *cl_arg = (char *) _cl_arg;
+	int current_arg_offset = 0;
+	int nargs, arg;
 	va_list varg_list;
 
 	STARPU_ASSERT(cl_arg);
 	va_start(varg_list, _cl_arg);
 
 	/* We fill the different pointers with the appropriate arguments */
-	unsigned char nargs = cl_arg[0];
-	current_arg_offset += sizeof(char);
+	memcpy(&nargs, cl_arg, sizeof(nargs));
+	current_arg_offset += sizeof(nargs);
 
-	unsigned arg;
 	for (arg = 0; arg < nargs; arg++)
 	{
 		void *argptr = va_arg(varg_list, void *);
-		size_t arg_size = *(size_t *)&cl_arg[current_arg_offset];
+
+		size_t arg_size;
+		memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size));
 		current_arg_offset += sizeof(size_t);
 
-		memcpy(argptr, &cl_arg[current_arg_offset], arg_size);
+		memcpy(argptr, cl_arg+current_arg_offset, arg_size);
 		current_arg_offset += arg_size;
 	}
 
@@ -65,8 +67,7 @@ void starpu_codelet_unpack_args(void *_cl_arg, ...)
 }
 
 static
-struct starpu_task *_starpu_task_build_v(struct starpu_codelet *cl, const char* task_name,
-					 int cl_arg_free, va_list varg_list)
+struct starpu_task *_starpu_task_build_v(struct starpu_codelet *cl, const char* task_name, int cl_arg_free, va_list varg_list)
 {
 	void *arg_buffer = NULL;
 	va_list varg_list_copy;

+ 8 - 9
src/util/starpu_task_insert_utils.c

@@ -51,7 +51,7 @@ void _starpu_task_insert_get_args_size(va_list varg_list, unsigned *nbuffers, si
 	arg_buffer_size = 0;
 	n = 0;
 
-	arg_buffer_size += sizeof(char);
+	arg_buffer_size += sizeof(int);
 
 	while ((arg_type = va_arg(varg_list, int)) != 0)
 	{
@@ -159,15 +159,14 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 {
 	int arg_type;
 	unsigned current_arg_offset = 0;
-	unsigned char nargs = 0;
-	char *_arg_buffer;
+	int nargs = 0;
+	char *_arg_buffer; // We would like a void* but we use a char* to allow pointer arithmetic
 
 	/* The buffer will contain : nargs, {size, content} (x nargs)*/
-
 	_arg_buffer = malloc(arg_buffer_size);
 
-	/* We will begin the buffer with the number of args (which is stored as a char) */
-	current_arg_offset += sizeof(char);
+	/* We will begin the buffer with the number of args */
+	current_arg_offset += sizeof(nargs);
 
 	while((arg_type = va_arg(varg_list, int)) != 0)
 	{
@@ -186,10 +185,10 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 			void *ptr = va_arg(varg_list, void *);
 			size_t cst_size = va_arg(varg_list, size_t);
 
-			*(size_t *)(&(_arg_buffer)[current_arg_offset]) = cst_size;
+			memcpy(_arg_buffer+current_arg_offset, (void *)&cst_size, sizeof(cst_size));
 			current_arg_offset += sizeof(size_t);
 
-			memcpy(&_arg_buffer[current_arg_offset], ptr, cst_size);
+			memcpy(_arg_buffer+current_arg_offset, ptr, cst_size);
 			current_arg_offset += cst_size;
 
 			nargs++;
@@ -272,7 +271,7 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 
 	if (nargs)
 	{
-		_arg_buffer[0] = nargs;
+		memcpy(_arg_buffer, (int *)&nargs, sizeof(nargs));
 	}
 	else
 	{