ReactOS 0.4.16-dev-1946-g52006dd
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 201 of file mutex.c.

202{
203 uacpi_thread_id this_id;
205
206 this_id = uacpi_kernel_get_thread_id();
207 if (UACPI_ATOMIC_LOAD_THREAD_ID(&mutex->owner) == this_id) {
208 if (uacpi_unlikely(mutex->depth == 0xFFFF)) {
210 "failing an attempt to acquire mutex @%p, too many recursive "
211 "acquires\n", mutex
212 );
213 return UACPI_STATUS_DENIED;
214 }
215
216 mutex->depth++;
217 return ret;
218 }
219
222 if (ret != UACPI_STATUS_OK)
223 goto out;
224
225 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle) {
229 goto out;
230 }
231 }
232
233 UACPI_ATOMIC_STORE_THREAD_ID(&mutex->owner, this_id);
234 mutex->depth = 1;
235
236out:
238 return ret;
239}
#define UACPI_ATOMIC_STORE_THREAD_ID(ptr, value)
Definition: arch_helpers.h:27
#define UACPI_ATOMIC_LOAD_THREAD_ID(ptr)
Definition: arch_helpers.h:23
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:20
uacpi_status uacpi_namespace_write_unlock(void)
Definition: namespace.c:54
uacpi_status uacpi_namespace_write_lock(void)
Definition: namespace.c:49
#define uacpi_unlikely(expr)
Definition: compiler.h:58
#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:146
static uacpi_status uacpi_acquire_global_lock_from_firmware(void)
Definition: mutex.c:55
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 access_field_unit(), enter_method(), and handle_mutex_ctl().

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

268{
269 if (uacpi_unlikely(lock->depth)) {
271 "de-initializing active recursive lock %p with depth=%zu\n",
272 lock, lock->depth
273 );
274 lock->depth = 0;
275 }
276
277 lock->owner = UACPI_THREAD_ID_NONE;
278
279 if (lock->mutex != UACPI_NULL) {
281 lock->mutex = UACPI_NULL;
282 }
283
284 return UACPI_STATUS_OK;
285}
#define UACPI_THREAD_ID_NONE
Definition: arch_helpers.h:35
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 255 of file mutex.c.

256{
258 if (uacpi_unlikely(lock->mutex == UACPI_NULL))
260
261 lock->owner = UACPI_THREAD_ID_NONE;
262 lock->depth = 0;
263
264 return UACPI_STATUS_OK;
265}
@ 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 241 of file mutex.c.

242{
243 if (mutex->depth-- > 1)
244 return UACPI_STATUS_OK;
245
246 if (mutex->handle == g_uacpi_rt_ctx.global_lock_mutex->handle)
248
251
252 return UACPI_STATUS_OK;
253}
static void uacpi_release_global_lock_to_firmware(void)
Definition: mutex.c:105

Referenced by access_field_unit(), enter_method(), handle_mutex_ctl(), and held_mutexes_array_remove_and_release().

◆ uacpi_release_native_mutex()

◆ uacpi_release_native_mutex_may_be_null()

static uacpi_status uacpi_release_native_mutex_may_be_null ( uacpi_handle  mtx)
inlinestatic

◆ uacpi_rw_lock_deinit()

uacpi_status uacpi_rw_lock_deinit ( struct uacpi_rw_lock lock)

Definition at line 333 of file mutex.c.

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

Referenced by uacpi_deinitialize_namespace().

◆ uacpi_rw_lock_init()

uacpi_status uacpi_rw_lock_init ( struct uacpi_rw_lock lock)

Definition at line 316 of file mutex.c.

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

Referenced by uacpi_initialize_namespace().

◆ uacpi_rw_lock_read()

uacpi_status uacpi_rw_lock_read ( struct uacpi_rw_lock lock)

Definition at line 353 of file mutex.c.

354{
356
357 ret = uacpi_acquire_native_mutex(lock->read_mutex);
359 return ret;
360
361 if (lock->num_readers++ == 0) {
362 ret = uacpi_acquire_native_mutex(lock->write_mutex);
364 lock->num_readers = 0;
365 }
366
367 uacpi_kernel_release_mutex(lock->read_mutex);
368 return ret;
369}

Referenced by uacpi_namespace_read_lock().

◆ uacpi_rw_lock_write()

uacpi_status uacpi_rw_lock_write ( struct uacpi_rw_lock lock)

Definition at line 386 of file mutex.c.

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

Referenced by uacpi_namespace_write_lock().

◆ uacpi_rw_unlock_read()

uacpi_status uacpi_rw_unlock_read ( struct uacpi_rw_lock lock)

Definition at line 371 of file mutex.c.

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

Referenced by uacpi_namespace_read_unlock().

◆ uacpi_rw_unlock_write()

uacpi_status uacpi_rw_unlock_write ( struct uacpi_rw_lock lock)

Definition at line 391 of file mutex.c.

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

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

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

Referenced by enter_method(), and handle_mutex_ctl().