Browse Source

port r14413 from 1.2: revert and fix 14253: we mustn't set task->dyn_modes when the codelet already provides its dyn_modes, in which case the application will use STARPU_DATA_ARRAY

Samuel Thibault 10 years ago
parent
commit
fa26ba61b5
1 changed files with 9 additions and 4 deletions
  1. 9 4
      src/util/starpu_task_insert_utils.c

+ 9 - 4
src/util/starpu_task_insert_utils.c

@@ -187,23 +187,28 @@ void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct star
 		if (*allocated_buffers == 0)
 		{
 			int i;
+			struct starpu_codelet *cl = (*task)->cl;
 			*allocated_buffers = STARPU_NMAXBUFS * 2;
 			(*task)->dyn_handles = malloc(*allocated_buffers * sizeof(starpu_data_handle_t));
 			for(i=0 ; i<current_buffer ; i++)
 			{
 				(*task)->dyn_handles[i] = (*task)->handles[i];
 			}
-			(*task)->dyn_modes = malloc(*allocated_buffers * sizeof(enum starpu_data_access_mode));
-			for(i=0 ; i<current_buffer ; i++)
+			if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl->dyn_modes)
 			{
-				(*task)->dyn_modes[i] = (*task)->modes[i];
+				(*task)->dyn_modes = malloc(*allocated_buffers * sizeof(enum starpu_data_access_mode));
+				for(i=0 ; i<current_buffer ; i++)
+				{
+					(*task)->dyn_modes[i] = (*task)->modes[i];
+				}
 			}
 		}
 		else if (current_buffer >= *allocated_buffers)
 		{
 			*allocated_buffers *= 2;
 			(*task)->dyn_handles = realloc((*task)->dyn_handles, *allocated_buffers * sizeof(starpu_data_handle_t));
-			(*task)->dyn_modes = realloc((*task)->dyn_modes, *allocated_buffers * sizeof(enum starpu_data_access_mode));
+			if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || !cl->dyn_modes)
+				(*task)->dyn_modes = realloc((*task)->dyn_modes, *allocated_buffers * sizeof(enum starpu_data_access_mode));
 		}
 	}
 }