ReactOS 0.4.17-dev-1190-g4c812f4
mutex.h File Reference
Include dependency graph for mutex.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  uacpi_recursive_lock
 
struct  uacpi_rw_lock
 

Functions

uacpi_bool uacpi_this_thread_owns_aml_mutex (uacpi_mutex *)
 
uacpi_status uacpi_acquire_aml_mutex (uacpi_mutex *, uacpi_u16 timeout)
 
uacpi_status uacpi_release_aml_mutex (uacpi_mutex *)
 
static uacpi_handle uacpi_create_native_mutex (void)
 
static void uacpi_free_native_mutex (uacpi_handle mtx)
 
static uacpi_status uacpi_acquire_native_mutex (uacpi_handle mtx)
 
uacpi_status uacpi_acquire_native_mutex_with_timeout (uacpi_handle mtx, uacpi_u16 timeout)
 
static uacpi_status uacpi_release_native_mutex (uacpi_handle mtx)
 
static uacpi_status uacpi_acquire_native_mutex_may_be_null (uacpi_handle mtx)
 
static uacpi_status uacpi_release_native_mutex_may_be_null (uacpi_handle mtx)
 
static uacpi_handle uacpi_create_native_event (void)
 
static void uacpi_free_native_event (uacpi_handle evt)
 
static uacpi_bool uacpi_wait_for_native_event (uacpi_handle evt, uacpi_u16 timeout)
 
static void uacpi_signal_native_event (uacpi_handle evt)
 
static void uacpi_reset_native_event (uacpi_handle evt)
 
uacpi_status uacpi_recursive_lock_init (struct uacpi_recursive_lock *lock)
 
uacpi_status uacpi_recursive_lock_deinit (struct uacpi_recursive_lock *lock)
 
uacpi_status uacpi_recursive_lock_acquire (struct uacpi_recursive_lock *lock)
 
uacpi_status uacpi_recursive_lock_release (struct uacpi_recursive_lock *lock)
 
uacpi_status uacpi_rw_lock_init (struct uacpi_rw_lock *lock)
 
uacpi_status uacpi_rw_lock_deinit (struct uacpi_rw_lock *lock)
 
uacpi_status uacpi_rw_lock_read (struct uacpi_rw_lock *lock)
 
uacpi_status uacpi_rw_unlock_read (struct uacpi_rw_lock *lock)
 
uacpi_status uacpi_rw_lock_write (struct uacpi_rw_lock *lock)
 
uacpi_status uacpi_rw_unlock_write (struct uacpi_rw_lock *lock)
 

Function Documentation

◆ uacpi_acquire_aml_mutex()

uacpi_status uacpi_acquire_aml_mutex ( uacpi_mutex *  mutex,
uacpi_u16  timeout 
)

Definition at line 199 of file mutex.c.

200{
201 uacpi_thread_id this_id;
203
204 this_id = uacpi_kernel_get_thread_id();
205 if (UACPI_ATOMIC_LOAD_THREAD_ID(&mutex->owner) == this_id) {
206 if (uacpi_unlikely(mutex->depth == 0xFFFF)) {
208 "failing an attempt to acquire mutex @%p, too many recursive "
209 "acquires", mutex
210 );
211 return UACPI_STATUS_DENIED;
212 }
213
214 mutex->depth++;
215 return ret;
216 }
217
220 if (ret != UACPI_STATUS_OK)
221 goto out;
222
223 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle) {
227 goto out;
228 }
229 }
230
231 UACPI_ATOMIC_STORE_THREAD_ID(&mutex->owner, this_id);
232 mutex->depth = 1;
233
234out:
236 return ret;
237}
#define UACPI_ATOMIC_STORE_THREAD_ID(ptr, value)
Definition: arch_helpers.h:28
#define UACPI_ATOMIC_LOAD_THREAD_ID(ptr)
Definition: arch_helpers.h:24
uacpi_status uacpi_acquire_native_mutex_with_timeout(uacpi_handle mtx, uacpi_u16 timeout)
static uacpi_status uacpi_release_native_mutex(uacpi_handle mtx)
Definition: mutex.h:44
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:18
#define uacpi_warn(...)
Definition: log.h:35
uacpi_status uacpi_namespace_write_unlock(void)
Definition: namespace.c:51
uacpi_status uacpi_namespace_write_lock(void)
Definition: namespace.c:46
#define uacpi_unlikely(expr)
Definition: compiler.h:88
#define uacpi_unlikely_error(expr)
Definition: status.h:50
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_OK
Definition: status.h:11
@ UACPI_STATUS_DENIED
Definition: status.h:31
return ret
Definition: mutex.c:147
static uacpi_status uacpi_acquire_global_lock_from_firmware(void)
Definition: mutex.c:56
uacpi_thread_id uacpi_kernel_get_thread_id(void)
Definition: uacpiosl.c:184
Definition: module.h:456
Definition: dhcpd.h:248
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by enter_method(), handle_mutex_ctl(), and lock_field_unit_transaction().

◆ uacpi_acquire_native_mutex()

◆ uacpi_acquire_native_mutex_may_be_null()

◆ uacpi_acquire_native_mutex_with_timeout()

uacpi_status uacpi_acquire_native_mutex_with_timeout ( uacpi_handle  mtx,
uacpi_u16  timeout 
)

◆ uacpi_create_native_event()

static uacpi_handle uacpi_create_native_event ( void  )
inlinestatic

Definition at line 78 of file mutex.h.

79{
81}
uacpi_handle uacpi_kernel_create_semaphore(uacpi_u32 initial_units)

Referenced by event_alloc(), and uacpi_initialize_events().

◆ uacpi_create_native_mutex()

static uacpi_handle uacpi_create_native_mutex ( void  )
inlinestatic

◆ uacpi_free_native_event()

static void uacpi_free_native_event ( uacpi_handle  evt)
inlinestatic

Definition at line 83 of file mutex.h.

84{
86}
void uacpi_kernel_free_semaphore(uacpi_handle)

Referenced by free_event(), and uacpi_state_reset().

◆ uacpi_free_native_mutex()

◆ uacpi_recursive_lock_acquire()

uacpi_status uacpi_recursive_lock_acquire ( struct uacpi_recursive_lock *  lock)

◆ uacpi_recursive_lock_deinit()

uacpi_status uacpi_recursive_lock_deinit ( struct uacpi_recursive_lock *  lock)

Definition at line 265 of file mutex.c.

266{
267 if (uacpi_unlikely(lock->depth)) {
269 "de-initializing active recursive lock %p with depth=%zu",
270 lock, lock->depth
271 );
272 lock->depth = 0;
273 }
274
275 lock->owner = UACPI_THREAD_ID_NONE;
276
277 if (lock->mutex != UACPI_NULL) {
279 lock->mutex = UACPI_NULL;
280 }
281
282 return UACPI_STATUS_OK;
283}
#define UACPI_THREAD_ID_NONE
Definition: arch_helpers.h:36
static void uacpi_free_native_mutex(uacpi_handle mtx)
Definition: mutex.h:27

Referenced by uacpi_deinitialize_events(), and uacpi_deinitialize_opregion().

◆ uacpi_recursive_lock_init()

uacpi_status uacpi_recursive_lock_init ( struct uacpi_recursive_lock *  lock)

Definition at line 253 of file mutex.c.

254{
256 if (uacpi_unlikely(lock->mutex == UACPI_NULL))
258
259 lock->owner = UACPI_THREAD_ID_NONE;
260 lock->depth = 0;
261
262 return UACPI_STATUS_OK;
263}
static uacpi_handle uacpi_create_native_mutex(void)
Definition: mutex.h:22
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13

Referenced by uacpi_initialize_events_early(), and uacpi_initialize_opregion().

◆ uacpi_recursive_lock_release()

◆ uacpi_release_aml_mutex()

uacpi_status uacpi_release_aml_mutex ( uacpi_mutex *  mutex)

Definition at line 239 of file mutex.c.

240{
241 if (mutex->depth-- > 1)
242 return UACPI_STATUS_OK;
243
244 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle)
246
249
250 return UACPI_STATUS_OK;
251}
static void uacpi_release_global_lock_to_firmware(void)
Definition: mutex.c:106

Referenced by enter_method(), handle_mutex_ctl(), held_mutexes_array_remove_and_release(), lock_field_unit_transaction(), and unlock_field_unit_transaction().

◆ uacpi_release_native_mutex()

◆ uacpi_release_native_mutex_may_be_null()

◆ uacpi_reset_native_event()

static void uacpi_reset_native_event ( uacpi_handle  evt)
inlinestatic

Definition at line 106 of file mutex.h.

107{
109}

Referenced by handle_event_ctl().

◆ uacpi_rw_lock_deinit()

uacpi_status uacpi_rw_lock_deinit ( struct uacpi_rw_lock *  lock)

Definition at line 331 of file mutex.c.

332{
333 if (uacpi_unlikely(lock->num_readers)) {
334 uacpi_warn("de-initializing rw_lock %p with %zu active readers",
335 lock, lock->num_readers);
336 lock->num_readers = 0;
337 }
338
339 if (lock->read_mutex != UACPI_NULL) {
340 uacpi_free_native_mutex(lock->read_mutex);
341 lock->read_mutex = UACPI_NULL;
342 }
343 if (lock->write_mutex != UACPI_NULL) {
344 uacpi_free_native_mutex(lock->write_mutex);
345 lock->write_mutex = UACPI_NULL;
346 }
347
348 return UACPI_STATUS_OK;
349}

Referenced by uacpi_deinitialize_namespace().

◆ uacpi_rw_lock_init()

uacpi_status uacpi_rw_lock_init ( struct uacpi_rw_lock *  lock)

Definition at line 314 of file mutex.c.

315{
316 lock->read_mutex = uacpi_create_native_mutex();
317 if (uacpi_unlikely(lock->read_mutex == UACPI_NULL))
319
320 lock->write_mutex = uacpi_create_native_mutex();
321 if (uacpi_unlikely(lock->write_mutex == UACPI_NULL)) {
322 uacpi_free_native_mutex(lock->read_mutex);
323 lock->read_mutex = UACPI_NULL;
325 }
326
327 lock->num_readers = 0;
328 return UACPI_STATUS_OK;
329}

Referenced by uacpi_initialize_namespace().

◆ uacpi_rw_lock_read()

uacpi_status uacpi_rw_lock_read ( struct uacpi_rw_lock *  lock)

Definition at line 351 of file mutex.c.

352{
354
355 ret = uacpi_acquire_native_mutex(lock->read_mutex);
357 return ret;
358
359 if (lock->num_readers++ == 0) {
360 ret = uacpi_acquire_native_mutex(lock->write_mutex);
362 lock->num_readers = 0;
363 }
364
365 uacpi_release_native_mutex(lock->read_mutex);
366 return ret;
367}

Referenced by uacpi_namespace_read_lock().

◆ uacpi_rw_lock_write()

uacpi_status uacpi_rw_lock_write ( struct uacpi_rw_lock *  lock)

Definition at line 384 of file mutex.c.

385{
386 return uacpi_acquire_native_mutex(lock->write_mutex);
387}

Referenced by uacpi_namespace_write_lock().

◆ uacpi_rw_unlock_read()

uacpi_status uacpi_rw_unlock_read ( struct uacpi_rw_lock *  lock)

Definition at line 369 of file mutex.c.

370{
372
373 ret = uacpi_acquire_native_mutex(lock->read_mutex);
375 return ret;
376
377 if (lock->num_readers-- == 1)
378 uacpi_release_native_mutex(lock->write_mutex);
379
380 uacpi_release_native_mutex(lock->read_mutex);
381 return ret;
382}

Referenced by uacpi_namespace_read_unlock().

◆ uacpi_rw_unlock_write()

uacpi_status uacpi_rw_unlock_write ( struct uacpi_rw_lock *  lock)

Definition at line 389 of file mutex.c.

390{
391 return uacpi_release_native_mutex(lock->write_mutex);
392}

Referenced by uacpi_namespace_write_unlock().

◆ uacpi_signal_native_event()

static void uacpi_signal_native_event ( uacpi_handle  evt)
inlinestatic

Definition at line 95 of file mutex.h.

Referenced by handle_event_ctl(), and handle_global_lock().

◆ uacpi_this_thread_owns_aml_mutex()

uacpi_bool uacpi_this_thread_owns_aml_mutex ( uacpi_mutex *  mutex)

Definition at line 191 of file mutex.c.

192{
194
196 return id == uacpi_kernel_get_thread_id();
197}
GLuint id
Definition: glext.h:5910

Referenced by enter_method(), and handle_mutex_ctl().

◆ uacpi_wait_for_native_event()

static uacpi_bool uacpi_wait_for_native_event ( uacpi_handle  evt,
uacpi_u16  timeout 
)
inlinestatic

Definition at line 88 of file mutex.h.

Referenced by handle_event_ctl(), and uacpi_acquire_global_lock_from_firmware().