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... */ set_delayed_call(struct delayed_call * call,void (* fn)(void *),void * arg)18static 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 do_delayed_call(struct delayed_call * call)25static inline void do_delayed_call(struct delayed_call *call) 26 { 27 if (call->fn) 28 call->fn(call->arg); 29 } 30 clear_delayed_call(struct delayed_call * call)31static inline void clear_delayed_call(struct delayed_call *call) 32 { 33 call->fn = NULL; 34 } 35 #endif 36