Put lwkt_serialize_array_{enter,try,exit}() into its own header file;
[dragonfly.git] / sys / sys / serialize.h
CommitLineData
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
21struct thread;
22
23struct 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
43typedef struct lwkt_serialize *lwkt_serialize_t;
44
45void lwkt_serialize_init(lwkt_serialize_t);
46void lwkt_serialize_enter(lwkt_serialize_t);
d1d48a34
SZ
47#ifdef SMP
48void lwkt_serialize_adaptive_enter(lwkt_serialize_t);
49#endif
3e086307 50int lwkt_serialize_try(lwkt_serialize_t);
e9cb6d99
MD
51void lwkt_serialize_exit(lwkt_serialize_t);
52void lwkt_serialize_handler_disable(lwkt_serialize_t);
53void lwkt_serialize_handler_enable(lwkt_serialize_t);
477d3c1c
MD
54void lwkt_serialize_handler_call(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
55int lwkt_serialize_handler_try(lwkt_serialize_t, void (*)(void *, void *), void *, void *);
e9cb6d99 56
9db4b353 57#endif /* !_SYS_SERIALIZE_H_ */