#ifndef __OS_LOCK_INTERNAL__
#define __OS_LOCK_INTERNAL__
#define OS_LOCK_S_INTERNAL(type) _os_lock_##type##_s
#define OS_LOCK_T_INTERNAL(type) _os_lock_##type##_t
#define OS_LOCK_STRUCT_INTERNAL(type) struct OS_LOCK_S_INTERNAL(type)
#define OS_LOCK_T_MEMBER(type) \
OS_LOCK_STRUCT(type) *_osl_opaque_##type; \
OS_LOCK_STRUCT_INTERNAL(type) *_osl_##type
#define OS_LOCK_STRUCT_DECL_INTERNAL(type, ...) \
typedef struct OS_LOCK_S_INTERNAL(type) { \
OS_LOCK_TYPE_STRUCT(type) * osl_type; \
__VA_ARGS__ \
} OS_LOCK_S_INTERNAL(type); \
typedef OS_LOCK_STRUCT_INTERNAL(type) *OS_LOCK_T_INTERNAL(type)
#define OS_LOCK_METHODS_DECL(type) \
void _os_lock_##type##_lock(OS_LOCK_T_INTERNAL(type)); \
bool _os_lock_##type##_trylock(OS_LOCK_T_INTERNAL(type)); \
void _os_lock_##type##_unlock(OS_LOCK_T_INTERNAL(type))
#define OS_LOCK_TYPE_STRUCT_DECL(type) \
OS_LOCK_TYPE_STRUCT(type) { \
const char *osl_kind; \
void (*osl_lock)(os_lock_t); \
bool (*osl_trylock)(os_lock_t); \
void (*osl_unlock)(os_lock_t); \
} OS_LOCK_TYPE_REF(type)
#define OS_LOCK_TYPE_INSTANCE(type) \
OS_LOCK_TYPE_STRUCT_DECL(type) = { \
.osl_kind = #type, \
.osl_lock = _os_lock_##type##_lock, \
.osl_trylock = _os_lock_##type##_trylock, \
.osl_unlock = _os_lock_##type##_unlock, \
}
#endif // __OS_LOCK_INTERNAL__