1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _DELAYED_CALL_H |
3 | #define _DELAYED_CALL_H |
4 | |
5 | /* |
6 | * Poor man's closures; I wish we could've done them sanely polymorphic, |
7 | * but... |
8 | */ |
9 | |
10 | struct delayed_call { |
11 | void (*fn)(void *); |
12 | void *arg; |
13 | }; |
14 | |
15 | #define DEFINE_DELAYED_CALL(name) struct delayed_call name = {NULL, NULL} |
16 | |
17 | /* I really wish we had closures with sane typechecking... */ |
18 | static inline void set_delayed_call(struct delayed_call *call, |
19 | void (*fn)(void *), void *arg) |
20 | { |
21 | call->fn = fn; |
22 | call->arg = arg; |
23 | } |
24 | |
25 | static inline void do_delayed_call(struct delayed_call *call) |
26 | { |
27 | if (call->fn) |
28 | call->fn(call->arg); |
29 | } |
30 | |
31 | static inline void clear_delayed_call(struct delayed_call *call) |
32 | { |
33 | call->fn = NULL; |
34 | } |
35 | #endif |
36 | |