| #ifndef _DELAYED_CALL_H |
| #define _DELAYED_CALL_H |
| |
| /* |
| * Poor man's closures; I wish we could've done them sanely polymorphic, |
| * but... |
| */ |
| |
| struct delayed_call { |
| void (*fn)(void *); |
| void *arg; |
| }; |
| |
| #define DEFINE_DELAYED_CALL(name) struct delayed_call name = {NULL, NULL} |
| |
| /* I really wish we had closures with sane typechecking... */ |
| static inline void set_delayed_call(struct delayed_call *call, |
| void (*fn)(void *), void *arg) |
| { |
| call->fn = fn; |
| call->arg = arg; |
| } |
| |
| static inline void do_delayed_call(struct delayed_call *call) |
| { |
| if (call->fn) |
| call->fn(call->arg); |
| } |
| |
| static inline void clear_delayed_call(struct delayed_call *call) |
| { |
| call->fn = NULL; |
| } |
| #endif |