| 1 | #pragma once |
|---|---|
| 2 | |
| 3 | #include <uacpi/internal/types.h> |
| 4 | #include <uacpi/kernel_api.h> |
| 5 | |
| 6 | #ifndef UACPI_BAREBONES_MODE |
| 7 | |
| 8 | uacpi_bool uacpi_this_thread_owns_aml_mutex(uacpi_mutex*); |
| 9 | |
| 10 | uacpi_status uacpi_acquire_aml_mutex(uacpi_mutex*, uacpi_u16 timeout); |
| 11 | uacpi_status uacpi_release_aml_mutex(uacpi_mutex*); |
| 12 | |
| 13 | static inline uacpi_status uacpi_acquire_native_mutex(uacpi_handle mtx) |
| 14 | { |
| 15 | if (uacpi_unlikely(mtx == UACPI_NULL)) |
| 16 | return UACPI_STATUS_INVALID_ARGUMENT; |
| 17 | |
| 18 | return uacpi_kernel_acquire_mutex(mtx, 0xFFFF); |
| 19 | } |
| 20 | |
| 21 | uacpi_status uacpi_acquire_native_mutex_with_timeout( |
| 22 | uacpi_handle mtx, uacpi_u16 timeout |
| 23 | ); |
| 24 | |
| 25 | static inline uacpi_status uacpi_release_native_mutex(uacpi_handle mtx) |
| 26 | { |
| 27 | if (uacpi_unlikely(mtx == UACPI_NULL)) |
| 28 | return UACPI_STATUS_INVALID_ARGUMENT; |
| 29 | |
| 30 | uacpi_kernel_release_mutex(mtx); |
| 31 | return UACPI_STATUS_OK; |
| 32 | } |
| 33 | |
| 34 | static inline uacpi_status uacpi_acquire_native_mutex_may_be_null( |
| 35 | uacpi_handle mtx |
| 36 | ) |
| 37 | { |
| 38 | if (mtx == UACPI_NULL) |
| 39 | return UACPI_STATUS_OK; |
| 40 | |
| 41 | return uacpi_kernel_acquire_mutex(mtx, 0xFFFF); |
| 42 | } |
| 43 | |
| 44 | static inline uacpi_status uacpi_release_native_mutex_may_be_null( |
| 45 | uacpi_handle mtx |
| 46 | ) |
| 47 | { |
| 48 | if (mtx == UACPI_NULL) |
| 49 | return UACPI_STATUS_OK; |
| 50 | |
| 51 | uacpi_kernel_release_mutex(mtx); |
| 52 | return UACPI_STATUS_OK; |
| 53 | } |
| 54 | |
| 55 | struct uacpi_recursive_lock { |
| 56 | uacpi_handle mutex; |
| 57 | uacpi_size depth; |
| 58 | uacpi_thread_id owner; |
| 59 | }; |
| 60 | |
| 61 | uacpi_status uacpi_recursive_lock_init(struct uacpi_recursive_lock *lock); |
| 62 | uacpi_status uacpi_recursive_lock_deinit(struct uacpi_recursive_lock *lock); |
| 63 | |
| 64 | uacpi_status uacpi_recursive_lock_acquire(struct uacpi_recursive_lock *lock); |
| 65 | uacpi_status uacpi_recursive_lock_release(struct uacpi_recursive_lock *lock); |
| 66 | |
| 67 | struct uacpi_rw_lock { |
| 68 | uacpi_handle read_mutex; |
| 69 | uacpi_handle write_mutex; |
| 70 | uacpi_size num_readers; |
| 71 | }; |
| 72 | |
| 73 | uacpi_status uacpi_rw_lock_init(struct uacpi_rw_lock *lock); |
| 74 | uacpi_status uacpi_rw_lock_deinit(struct uacpi_rw_lock *lock); |
| 75 | |
| 76 | uacpi_status uacpi_rw_lock_read(struct uacpi_rw_lock *lock); |
| 77 | uacpi_status uacpi_rw_unlock_read(struct uacpi_rw_lock *lock); |
| 78 | |
| 79 | uacpi_status uacpi_rw_lock_write(struct uacpi_rw_lock *lock); |
| 80 | uacpi_status uacpi_rw_unlock_write(struct uacpi_rw_lock *lock); |
| 81 | |
| 82 | #endif // !UACPI_BAREBONES_MODE |
| 83 |