Browse Source

examples/pipeline: deal with ENODEV errrors and unregister data before shutting down StarPU

Nathalie Furmento 13 years ago
parent
commit
5440abcc7c
1 changed files with 15 additions and 4 deletions
  1. 15 4
      examples/pipeline/pipeline.c

+ 15 - 4
examples/pipeline/pipeline.c

@@ -174,11 +174,13 @@ static struct starpu_codelet pipeline_codelet_sum =
 	.model = &pipeline_model_sum
 };
 
-int main(void) {
-	int ret;
+int main(void)
+{
+	int ret = 0;
 	int k, l, c;
 	starpu_data_handle_t buffersX[K], buffersY[K], buffersP[K];
 	sem_t sems[C];
+
 	ret = starpu_init(NULL);
 	if (ret == -ENODEV)
 		exit(77);
@@ -200,7 +202,6 @@ int main(void) {
 
 	/* Submits the l pipeline stages */
 	for (l = 0; l < L; l++) {
-		int ret;
 		float x = l;
 		float y = 2*l;
 		/* First wait for the C previous concurrent stages */
@@ -212,29 +213,39 @@ int main(void) {
 				STARPU_W, buffersX[l%K],
 				STARPU_VALUE, &x, sizeof(x),
 				0);
+		if (ret == -ENODEV) goto enodev;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task x");
 
 		ret = starpu_insert_task(&pipeline_codelet_x,
 				STARPU_W, buffersY[l%K],
 				STARPU_VALUE, &y, sizeof(y),
 				0);
+		if (ret == -ENODEV) goto enodev;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task y");
 
 		ret = starpu_insert_task(&pipeline_codelet_axpy,
 				STARPU_R, buffersX[l%K],
 				STARPU_RW, buffersY[l%K],
 				0);
+		if (ret == -ENODEV) goto enodev;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task axpy");
 
 		ret = starpu_insert_task(&pipeline_codelet_sum,
 				STARPU_R, buffersY[l%K],
 				STARPU_CALLBACK_WITH_ARG, (void (*)(void*))sem_post, &sems[l%C],
 				0);
+		if (ret == -ENODEV) goto enodev;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task sum");
 	}
 	starpu_task_wait_for_all();
 
+enodev:
+	for (k = 0; k < K; k++) {
+		starpu_data_unregister(buffersX[k]);
+		starpu_data_unregister(buffersY[k]);
+		starpu_data_unregister(buffersP[k]);
+	}
 	starpu_shutdown();
 
-	return 0;
+	return ret;
 }