Loading...
Searching...
No Matches
19#ifndef _BOILERPLATE_LOCK_H
20#define _BOILERPLATE_LOCK_H
23#include <boilerplate/wrappers.h>
24#include <boilerplate/debug.h>
44#ifdef CONFIG_XENO_ASYNC_CANCEL
46#define CANCEL_DEFER(__s) \
48 pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, \
49 &(__s).cancel_type); \
52#define CANCEL_RESTORE(__s) \
54 pthread_setcanceltype((__s).cancel_type, NULL); \
60#define CANCEL_DEFER(__s) do { (void)(__s); } while (0)
62#define CANCEL_RESTORE(__s) do { } while (0)
67 pthread_mutex_t *lock;
68 void (*handler)(
void *arg);
72#define __push_cleanup_args(__cb, __lock, __fn, __arg) \
73 ((__cb)->lock = (__lock)), \
74 ((__cb)->handler = (void (*)(void *))(__fn)), \
75 ((__cb)->arg = (__arg))
77#define push_cleanup_handler(__cb, __lock, __fn, __arg) \
78 pthread_cleanup_push((void (*)(void *))__run_cleanup_block, \
79 (__push_cleanup_args(__cb, __lock, __fn, __arg), (__cb)))
81#define pop_cleanup_handler(__cb) \
82 pthread_cleanup_pop(0)
84#define push_cleanup_lock(__lock) \
85 pthread_cleanup_push((void (*)(void *))__RT(pthread_mutex_unlock), (__lock))
87#define pop_cleanup_lock(__lock) \
88 pthread_cleanup_pop(0)
90#ifdef CONFIG_XENO_DEBUG
91int __check_cancel_type(
const char *locktype);
93#define __check_cancel_type(__locktype) \
94 ({ (void)__locktype; 0; })
97#define __do_lock(__lock, __op) \
100 __ret = -__RT(pthread_mutex_##__op(__lock)); \
104#define __do_lock_nocancel(__lock, __type, __op) \
106 __bt(__check_cancel_type(#__op "_nocancel")); \
107 __do_lock(__lock, __op); \
110#define __do_unlock(__lock) \
113 __ret = -__RT(pthread_mutex_unlock(__lock)); \
135#define read_lock(__lock) \
136 __do_lock(__lock, lock)
138#define read_trylock(__lock) \
139 __do_lock(__lock, trylock)
141#define read_lock_nocancel(__lock) \
142 __do_lock_nocancel(__lock, read_lock, lock)
144#define read_trylock_nocancel(__lock) \
145 __do_lock_nocancel(__lock, read_trylock, trylock)
147#define read_unlock(__lock) \
150#define write_lock(__lock) \
151 __do_lock(__lock, lock)
153#define write_trylock(__lock) \
154 __do_lock(__lock, trylock)
156#define write_lock_nocancel(__lock) \
157 __do_lock_nocancel(__lock, write_lock, lock)
159#define write_trylock_nocancel(__lock) \
160 __do_lock_nocancel(__lock, write_trylock, trylock)
162#define write_unlock(__lock) \
165#define __do_lock_safe(__lock, __state, __op) \
167 int __ret, __oldstate; \
168 __bt(__check_cancel_type(#__op "_safe")); \
169 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &__oldstate); \
170 __ret = -__RT(pthread_mutex_##__op(__lock)); \
172 pthread_setcancelstate(__oldstate, NULL); \
173 __state = __oldstate; \
177#define __do_unlock_safe(__lock, __state) \
179 int __ret, __restored_state = __state; \
180 __ret = -__RT(pthread_mutex_unlock(__lock)); \
181 pthread_setcancelstate(__restored_state, NULL); \
193#define write_lock_safe(__lock, __state) \
194 __do_lock_safe(__lock, __state, lock)
196#define write_trylock_safe(__lock, __state) \
197 __do_lock_safe(__lock, __state, trylock)
199#define write_unlock_safe(__lock, __state) \
200 __do_unlock_safe(__lock, __state)
202#define read_lock_safe(__lock, __state) \
203 __do_lock_safe(__lock, __state, lock)
205#define read_unlock_safe(__lock, __state) \
206 __do_unlock_safe(__lock, __state)
208#ifdef CONFIG_XENO_DEBUG
209#define mutex_type_attribute PTHREAD_MUTEX_ERRORCHECK
211#define mutex_type_attribute PTHREAD_MUTEX_NORMAL
218void __run_cleanup_block(
struct cleanup_block *cb);