36 lines
		
	
	
		
			709 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			709 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #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
 |