Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
fceef393 AV |
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 |