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.3 2005/11/23 01:27:55 dillon Exp $ 12 */ 13 14 #ifndef _SYS_SERIALIZE_H_ 15 #define _SYS_SERIALIZE_H_ 16 17 #ifndef _MACHINE_ATOMIC_H_ 18 #include <machine/atomic.h> 19 #endif 20 21 struct thread; 22 23 struct lwkt_serialize { 24 atomic_intr_t interlock; 25 struct thread *last_td; 26 }; 27 28 /* 29 * Note that last_td is only maintained when INVARIANTS is turned on, 30 * so this check is only useful as part of a [K]KASSERT. 31 */ 32 #define ASSERT_SERIALIZED(ss) KKASSERT((ss)->last_td == curthread) 33 34 typedef struct lwkt_serialize *lwkt_serialize_t; 35 36 void lwkt_serialize_init(lwkt_serialize_t); 37 void lwkt_serialize_enter(lwkt_serialize_t); 38 int lwkt_serialize_try(lwkt_serialize_t); 39 void lwkt_serialize_exit(lwkt_serialize_t); 40 void lwkt_serialize_handler_disable(lwkt_serialize_t); 41 void lwkt_serialize_handler_enable(lwkt_serialize_t); 42 void lwkt_serialize_handler_call(lwkt_serialize_t, void (*)(void *, void *), void *, void *); 43 int lwkt_serialize_handler_try(lwkt_serialize_t, void (*)(void *, void *), void *, void *); 44 45 #endif 46