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