diff --git a/api/apiplan.c b/api/apiplan.c index 014fd4d5b..34fe27312 100644 --- a/api/apiplan.c +++ b/api/apiplan.c @@ -22,12 +22,15 @@ static X(before_planner_hook_t) before_planner_hook = 0; static X(after_planner_hook_t) after_planner_hook = 0; +static void *planner_hook_arg = 0; void X(set_planner_hooks)(X(before_planner_hook_t) before, - X(after_planner_hook_t) after) + X(after_planner_hook_t) after, + void *arg) { before_planner_hook = before; after_planner_hook = after; + planner_hook_arg = arg; } static plan *mkplan0(planner *plnr, unsigned flags, @@ -99,7 +102,7 @@ apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb) double pcost = 0; if (before_planner_hook) - before_planner_hook(); + before_planner_hook(planner_hook_arg); plnr = X(the_planner)(); @@ -175,7 +178,7 @@ apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb) #endif if (after_planner_hook) - after_planner_hook(); + after_planner_hook(planner_hook_arg); return p; } diff --git a/api/fftw3.h b/api/fftw3.h index 90221e407..e6a28240b 100644 --- a/api/fftw3.h +++ b/api/fftw3.h @@ -107,8 +107,8 @@ struct fftw_iodim64_do_not_use_me { typedef void (*fftw_write_char_func_do_not_use_me)(char c, void *); typedef int (*fftw_read_char_func_do_not_use_me)(void *); -typedef void (*fftw_before_planner_hook_do_not_use_me)(void); -typedef void (*fftw_after_planner_hook_do_not_use_me)(void); +typedef void (*fftw_before_planner_hook_do_not_use_me)(void *arg); +typedef void (*fftw_after_planner_hook_do_not_use_me)(void *arg); /* huge second-order macro that defines prototypes for all API @@ -136,9 +136,10 @@ typedef fftw_before_planner_hook_do_not_use_me X(before_planner_hook_t); \ typedef fftw_after_planner_hook_do_not_use_me X(after_planner_hook_t); \ \ FFTW_EXTERN void X(set_planner_hooks)(X(before_planner_hook_t) before, \ - X(after_planner_hook_t) after); \ - \ -FFTW_EXTERN void X(execute)(const X(plan) p); \ + X(after_planner_hook_t) after, \ + void *arg); \ + \ +FFTW_EXTERN void X(execute)(const X(plan) p); \ \ FFTW_EXTERN X(plan) X(plan_dft)(int rank, const int *n, \ C *in, C *out, int sign, unsigned flags); \ diff --git a/tests/fftw-bench.c b/tests/fftw-bench.c index fe9c29d5e..bbf4c1b70 100644 --- a/tests/fftw-bench.c +++ b/tests/fftw-bench.c @@ -198,13 +198,15 @@ int can_do(bench_problem *p) static int before_planner_hook_called = 0; static int after_planner_hook_called = 0; -static void before_planner_hook(void) +static void before_planner_hook(void *arg) { before_planner_hook_called = 1; + BENCH_ASSERT(arg == &before_planner_hook_called); } -static void after_planner_hook(void) +static void after_planner_hook(void *arg) { after_planner_hook_called = 1; + BENCH_ASSERT(arg == &before_planner_hook_called); } void setup(bench_problem *p) @@ -235,7 +237,7 @@ void setup(bench_problem *p) #endif if (setup_hooks) - FFTW(set_planner_hooks(before_planner_hook, after_planner_hook)); + FFTW(set_planner_hooks(before_planner_hook, after_planner_hook, &before_planner_hook_called)); before_planner_hook_called = 0; after_planner_hook_called = 0; @@ -250,7 +252,7 @@ void setup(bench_problem *p) BENCH_ASSERT(setup_hooks == after_planner_hook_called); /* do something different with hooks next time */ - FFTW(set_planner_hooks(0, 0)); + FFTW(set_planner_hooks(0, 0, 0)); setup_hooks = 1 - setup_hooks; {