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