| #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 |