ReactOS 0.4.17-dev-683-g0dafdc5
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_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)
 
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 202 of file mutex.c.

203{
204 uacpi_thread_id this_id;
206
207 this_id = uacpi_kernel_get_thread_id();
208 if (UACPI_ATOMIC_LOAD_THREAD_ID(&mutex->owner) == this_id) {
209 if (uacpi_unlikely(mutex->depth == 0xFFFF)) {
211 "failing an attempt to acquire mutex @%p, too many recursive "
212 "acquires", mutex
213 );
214 return UACPI_STATUS_DENIED;
215 }
216
217 mutex->depth++;
218 return ret;
219 }
220
223 if (ret != UACPI_STATUS_OK)
224 goto out;
225
226 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle) {
230 goto out;
231 }
232 }
233
234 UACPI_ATOMIC_STORE_THREAD_ID(&mutex->owner, this_id);
235 mutex->depth = 1;
236
237out:
239 return ret;
240}
#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:25
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17
#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:49
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()

static uacpi_status uacpi_acquire_native_mutex_may_be_null ( uacpi_handle  mtx)
inlinestatic

◆ uacpi_acquire_native_mutex_with_timeout()

uacpi_status uacpi_acquire_native_mutex_with_timeout ( uacpi_handle  mtx,
uacpi_u16  timeout 
)

◆ uacpi_recursive_lock_acquire()

◆ uacpi_recursive_lock_deinit()

uacpi_status uacpi_recursive_lock_deinit ( struct uacpi_recursive_lock lock)

Definition at line 268 of file mutex.c.

269{
270 if (uacpi_unlikely(lock->depth)) {
272 "de-initializing active recursive lock %p with depth=%zu",
273 lock, lock->depth
274 );
275 lock->depth = 0;
276 }
277
278 lock->owner = UACPI_THREAD_ID_NONE;
279
280 if (lock->mutex != UACPI_NULL) {
282 lock->mutex = UACPI_NULL;
283 }
284
285 return UACPI_STATUS_OK;
286}
#define UACPI_THREAD_ID_NONE
Definition: arch_helpers.h:36
void uacpi_kernel_free_mutex(uacpi_handle)
Definition: uacpiosl.c:146

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 256 of file mutex.c.

257{
259 if (uacpi_unlikely(lock->mutex == UACPI_NULL))
261
262 lock->owner = UACPI_THREAD_ID_NONE;
263 lock->depth = 0;
264
265 return UACPI_STATUS_OK;
266}
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
uacpi_handle uacpi_kernel_create_mutex(void)
Definition: uacpiosl.c:139

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 242 of file mutex.c.

243{
244 if (mutex->depth-- > 1)
245 return UACPI_STATUS_OK;
246
247 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle)
249
252
253 return UACPI_STATUS_OK;
254}
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_rw_lock_deinit()

uacpi_status uacpi_rw_lock_deinit ( struct uacpi_rw_lock lock)

Definition at line 334 of file mutex.c.

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

Referenced by uacpi_deinitialize_namespace().

◆ uacpi_rw_lock_init()

uacpi_status uacpi_rw_lock_init ( struct uacpi_rw_lock lock)

Definition at line 317 of file mutex.c.

318{
319 lock->read_mutex = uacpi_kernel_create_mutex();
320 if (uacpi_unlikely(lock->read_mutex == UACPI_NULL))
322
323 lock->write_mutex = uacpi_kernel_create_mutex();
324 if (uacpi_unlikely(lock->write_mutex == UACPI_NULL)) {
325 uacpi_kernel_free_mutex(lock->read_mutex);
326 lock->read_mutex = UACPI_NULL;
328 }
329
330 lock->num_readers = 0;
331 return UACPI_STATUS_OK;
332}

Referenced by uacpi_initialize_namespace().

◆ uacpi_rw_lock_read()

uacpi_status uacpi_rw_lock_read ( struct uacpi_rw_lock lock)

Definition at line 354 of file mutex.c.

355{
357
358 ret = uacpi_acquire_native_mutex(lock->read_mutex);
360 return ret;
361
362 if (lock->num_readers++ == 0) {
363 ret = uacpi_acquire_native_mutex(lock->write_mutex);
365 lock->num_readers = 0;
366 }
367
368 uacpi_kernel_release_mutex(lock->read_mutex);
369 return ret;
370}

Referenced by uacpi_namespace_read_lock().

◆ uacpi_rw_lock_write()

uacpi_status uacpi_rw_lock_write ( struct uacpi_rw_lock lock)

Definition at line 387 of file mutex.c.

388{
389 return uacpi_acquire_native_mutex(lock->write_mutex);
390}

Referenced by uacpi_namespace_write_lock().

◆ uacpi_rw_unlock_read()

uacpi_status uacpi_rw_unlock_read ( struct uacpi_rw_lock lock)

Definition at line 372 of file mutex.c.

373{
375
376 ret = uacpi_acquire_native_mutex(lock->read_mutex);
378 return ret;
379
380 if (lock->num_readers-- == 1)
381 uacpi_release_native_mutex(lock->write_mutex);
382
383 uacpi_kernel_release_mutex(lock->read_mutex);
384 return ret;
385}

Referenced by uacpi_namespace_read_unlock().

◆ uacpi_rw_unlock_write()

uacpi_status uacpi_rw_unlock_write ( struct uacpi_rw_lock lock)

Definition at line 392 of file mutex.c.

393{
394 return uacpi_release_native_mutex(lock->write_mutex);
395}

Referenced by uacpi_namespace_write_unlock().

◆ uacpi_this_thread_owns_aml_mutex()

uacpi_bool uacpi_this_thread_owns_aml_mutex ( uacpi_mutex mutex)

Definition at line 194 of file mutex.c.

195{
197
199 return id == uacpi_kernel_get_thread_id();
200}
GLuint id
Definition: glext.h:5910

Referenced by enter_method(), and handle_mutex_ctl().