tests/gem_concurrent_blt: extract run wrappers

Functional programming ftw!

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
diff --git a/tests/gem_concurrent_blit.c b/tests/gem_concurrent_blit.c
index cd77514..384bd7f 100644
--- a/tests/gem_concurrent_blit.c
+++ b/tests/gem_concurrent_blit.c
@@ -227,40 +227,94 @@
 		mode->cmp_bo(dst[i], 0xabcdabcd, width, height);
 }
 
+typedef void (*do_test)(struct access_mode *mode,
+			drm_intel_bo **src, drm_intel_bo **dst,
+			drm_intel_bo *dummy);
+
+typedef void (*run_wrap)(struct access_mode *mode,
+			 drm_intel_bo **src, drm_intel_bo **dst,
+			 drm_intel_bo *dummy,
+			 do_test do_test_func);
+
+static void run_single(struct access_mode *mode,
+		       drm_intel_bo **src, drm_intel_bo **dst,
+		       drm_intel_bo *dummy,
+		       do_test do_test_func)
+{
+	do_test_func(mode, src, dst, dummy);
+}
+
+
+static void run_looped(struct access_mode *mode,
+		       drm_intel_bo **src, drm_intel_bo **dst,
+		       drm_intel_bo *dummy,
+		       do_test do_test_func)
+{
+	int loop;
+
+	for (loop = 0; loop < 10; loop++)
+		do_test_func(mode, src, dst, dummy);
+}
+
+static void run_forked(struct access_mode *mode,
+		       drm_intel_bo **src, drm_intel_bo **dst,
+		       drm_intel_bo *dummy,
+		       do_test do_test_func)
+{
+	int loop, i, nc;
+	pid_t children[16];
+
+	for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
+		switch ((children[nc] = fork())) {
+		case -1: igt_assert(0);
+		default: break;
+		case 0:
+			 /* recreate process local variables */
+			 bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
+			 drm_intel_bufmgr_gem_enable_reuse(bufmgr);
+			 batch = intel_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd));
+			 for (i = 0; i < num_buffers; i++) {
+				 src[i] = mode->create_bo(bufmgr, i, width, height);
+				 dst[i] = mode->create_bo(bufmgr, ~i, width, height);
+			 }
+			 dummy = mode->create_bo(bufmgr, 0, width, height);
+			 for (loop = 0; loop < 10; loop++)
+				 do_test_func(mode, src, dst, dummy);
+			 exit(0);
+		}
+	}
+	for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
+		int status = -1;
+		while (waitpid(children[nc], &status, 0) == -1 &&
+		       errno == -EINTR)
+			;
+		igt_assert(status == 0);
+	}
+}
 
 static void
 run_basic_modes(struct access_mode *mode,
 		drm_intel_bo **src, drm_intel_bo **dst,
-		drm_intel_bo *dummy, bool interruptible)
+		drm_intel_bo *dummy, const char *suffix,
+		run_wrap run_wrap_func)
 {
-	int loop_max, loop;
-
-	loop_max = interruptible ? 10 : 1;
-
 	/* try to overwrite the source values */
-	igt_subtest_f("%s-overwrite-source%s", mode->name,
-		      interruptible ? "-interruptible" : "")
-		for (loop = 0; loop < loop_max; loop++)
-			do_overwrite_source(mode, src, dst, dummy);
+	igt_subtest_f("%s-overwrite-source%s", mode->name, suffix)
+		run_wrap_func(mode, src, dst, dummy, do_overwrite_source);
 
 	/* try to read the results before the copy completes */
-	igt_subtest_f("%s-early-read%s", mode->name,
-		      interruptible ? "-interruptible" : "")
-		for (loop = 0; loop < loop_max; loop++)
-			do_early_read(mode, src, dst, dummy);
+	igt_subtest_f("%s-early-read%s", mode->name, suffix)
+		run_wrap_func(mode, src, dst, dummy, do_early_read);
 
 	/* and finally try to trick the kernel into loosing the pending write */
-	igt_subtest_f("%s-gpu-read-after-write%s", mode->name,
-		      interruptible ? "-interruptible" : "")
-		for (loop = 0; loop < loop_max; loop++)
-			do_gpu_read_after_write(mode, src, dst, dummy);
+	igt_subtest_f("%s-gpu-read-after-write%s", mode->name, suffix)
+		run_wrap_func(mode, src, dst, dummy, do_gpu_read_after_write);
 }
 
 static void
 run_modes(struct access_mode *mode)
 {
-	int loop, i, nc;
-	pid_t children[16];
+	int i;
 
 	drm_intel_bo *src[128], *dst[128], *dummy = NULL;
 
@@ -272,99 +326,13 @@
 		dummy = mode->create_bo(bufmgr, 0, width, height);
 	}
 
-	run_basic_modes(mode, src, dst, dummy, false);
+	run_basic_modes(mode, src, dst, dummy, "", run_single);
 
 	igt_fork_signal_helper();
 
-	run_basic_modes(mode, src, dst, dummy, true);
+	run_basic_modes(mode, src, dst, dummy, "-interruptible", run_looped);
 
-	/* try to read the results before the copy completes */
-	igt_subtest_f("%s-overwrite-source-forked", mode->name) {
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			switch ((children[nc] = fork())) {
-			case -1: igt_assert(0);
-			default: break;
-			case 0:
-				 /* recreate process local variables */
-				 bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
-				 drm_intel_bufmgr_gem_enable_reuse(bufmgr);
-				 batch = intel_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd));
-				 for (i = 0; i < num_buffers; i++) {
-					 src[i] = mode->create_bo(bufmgr, i, width, height);
-					 dst[i] = mode->create_bo(bufmgr, ~i, width, height);
-				 }
-				 for (loop = 0; loop < 10; loop++)
-					 do_overwrite_source(mode, src, dst, dummy);
-				 exit(0);
-			}
-		}
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			int status = -1;
-			while (waitpid(children[nc], &status, 0) == -1 &&
-			       errno == -EINTR)
-				;
-			igt_assert(status == 0);
-		}
-	}
-
-	/* try to read the results before the copy completes */
-	igt_subtest_f("%s-early-read-forked", mode->name) {
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			switch ((children[nc] = fork())) {
-			case -1: igt_assert(0);
-			default: break;
-			case 0:
-				 /* recreate process local variables */
-				 bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
-				 drm_intel_bufmgr_gem_enable_reuse(bufmgr);
-				 batch = intel_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd));
-				 for (i = 0; i < num_buffers; i++) {
-					 src[i] = mode->create_bo(bufmgr, i, width, height);
-					 dst[i] = mode->create_bo(bufmgr, ~i, width, height);
-				 }
-				 for (loop = 0; loop < 10; loop++)
-					 do_early_read(mode, src, dst, dummy);
-				 exit(0);
-			}
-		}
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			int status = -1;
-			while (waitpid(children[nc], &status, 0) == -1 &&
-			       errno == -EINTR)
-				;
-			igt_assert(status == 0);
-		}
-	}
-
-	/* and finally try to trick the kernel into loosing the pending write */
-	igt_subtest_f("%s-gpu-read-after-write-forked", mode->name) {
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			switch ((children[nc] = fork())) {
-			case -1: igt_assert(0);
-			default: break;
-			case 0:
-				 /* recreate process local variables */
-				 bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
-				 drm_intel_bufmgr_gem_enable_reuse(bufmgr);
-				 batch = intel_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd));
-				 for (i = 0; i < num_buffers; i++) {
-					 src[i] = mode->create_bo(bufmgr, i, width, height);
-					 dst[i] = mode->create_bo(bufmgr, ~i, width, height);
-				 }
-				 dummy = mode->create_bo(bufmgr, 0, width, height);
-				 for (loop = 0; loop < 10; loop++)
-					 do_gpu_read_after_write(mode, src, dst, dummy);
-				 exit(0);
-			}
-		}
-		for (nc = 0; nc < ARRAY_SIZE(children); nc++) {
-			int status = -1;
-			while (waitpid(children[nc], &status, 0) == -1 &&
-			       errno == -EINTR)
-				;
-			igt_assert(status == 0);
-		}
-	}
+	run_basic_modes(mode, src, dst, dummy, "-forked", run_forked);
 
 	igt_stop_signal_helper();