xref: /dragonfly/sys/sys/serialize.h (revision c69bf40f)
1 /*
2  * Provides a fast serialization facility that will serialize across blocking
3  * conditions.  This facility is very similar to a lock but much faster for
4  * the common case.  It utilizes the atomic_intr_*() functions to acquire
5  * and release the serializer and token functions to block.
6  *
7  * This API is designed to be used whenever low level serialization is
8  * required.  Unlike tokens this serialization is not safe from deadlocks
9  * nor is it recursive, and care must be taken when using it.
10  */
11 
12 #ifndef _SYS_SERIALIZE_H_
13 #define _SYS_SERIALIZE_H_
14 
15 #include <machine/stdint.h>
16 
17 struct thread;
18 
19 struct lwkt_serialize {
20     __atomic_intr_t	interlock;
21     struct thread	*last_td;
22 };
23 
24 #define LWKT_SERIALIZE_INITIALIZER      { 0, NULL }
25 
26 #define IS_SERIALIZED(ss)		((ss)->last_td == curthread)
27 #define ASSERT_SERIALIZED(ss)		KKASSERT(IS_SERIALIZED((ss)))
28 #define ASSERT_NOT_SERIALIZED(ss)	KKASSERT(!IS_SERIALIZED((ss)))
29 
30 typedef struct lwkt_serialize *lwkt_serialize_t;
31 
32 void lwkt_serialize_init(lwkt_serialize_t);
33 void lwkt_serialize_enter(lwkt_serialize_t);
34 void lwkt_serialize_adaptive_enter(lwkt_serialize_t);
35 int lwkt_serialize_try(lwkt_serialize_t);
36 void lwkt_serialize_exit(lwkt_serialize_t);
37 void lwkt_serialize_handler_disable(lwkt_serialize_t);
38 void lwkt_serialize_handler_enable(lwkt_serialize_t);
39 void lwkt_serialize_handler_call(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
40 int lwkt_serialize_handler_try(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
41 
42 #endif	/* !_SYS_SERIALIZE_H_ */
43