88c0dc2c2484c83ec9d4671d16e9d496f1362d7b
[dragonfly.git] / sys / sys / serialize.h
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  * $DragonFly: src/sys/sys/serialize.h,v 1.9 2008/05/14 11:59:24 sephe Exp $
12  */
13
14 #ifndef _SYS_SERIALIZE_H_
15 #define _SYS_SERIALIZE_H_
16
17 #ifndef _MACHINE_STDINT_H_
18 #include <machine/stdint.h>
19 #endif
20
21 struct thread;
22
23 struct lwkt_serialize {
24     __atomic_intr_t     interlock;
25     struct thread       *last_td;
26     unsigned int        sleep_cnt;
27     unsigned int        tryfail_cnt;
28     unsigned int        enter_cnt;
29     unsigned int        try_cnt;
30 };
31
32 #ifdef INVARIANTS
33
34 /*
35  * Note that last_td is only maintained when INVARIANTS is turned on,
36  * so this check is only useful as part of a [K]KASSERT.
37  */
38 #define IS_SERIALIZED(ss)               ((ss)->last_td == curthread)
39 #define ASSERT_SERIALIZED(ss)           KKASSERT(IS_SERIALIZED((ss)))
40 #define ASSERT_NOT_SERIALIZED(ss)       KKASSERT(!IS_SERIALIZED((ss)))
41
42 #endif  /* INVARIANTS */
43
44 typedef struct lwkt_serialize *lwkt_serialize_t;
45
46 void lwkt_serialize_init(lwkt_serialize_t);
47 void lwkt_serialize_enter(lwkt_serialize_t);
48 #ifdef SMP
49 void lwkt_serialize_adaptive_enter(lwkt_serialize_t);
50 #endif
51 int lwkt_serialize_try(lwkt_serialize_t);
52 void lwkt_serialize_exit(lwkt_serialize_t);
53 void lwkt_serialize_handler_disable(lwkt_serialize_t);
54 void lwkt_serialize_handler_enable(lwkt_serialize_t);
55 void lwkt_serialize_handler_call(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
56 int lwkt_serialize_handler_try(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
57
58 #endif  /* !_SYS_SERIALIZE_H_ */