1#pragma once
2
3#include <uacpi/internal/types.h>
4#include <uacpi/kernel_api.h>
5
6#ifndef UACPI_BAREBONES_MODE
7
8uacpi_bool uacpi_this_thread_owns_aml_mutex(uacpi_mutex*);
9
10uacpi_status uacpi_acquire_aml_mutex(uacpi_mutex*, uacpi_u16 timeout);
11uacpi_status uacpi_release_aml_mutex(uacpi_mutex*);
12
13static 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
21uacpi_status uacpi_acquire_native_mutex_with_timeout(
22 uacpi_handle mtx, uacpi_u16 timeout
23);
24
25static 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
34static 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
44static 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
55struct uacpi_recursive_lock {
56 uacpi_handle mutex;
57 uacpi_size depth;
58 uacpi_thread_id owner;
59};
60
61uacpi_status uacpi_recursive_lock_init(struct uacpi_recursive_lock *lock);
62uacpi_status uacpi_recursive_lock_deinit(struct uacpi_recursive_lock *lock);
63
64uacpi_status uacpi_recursive_lock_acquire(struct uacpi_recursive_lock *lock);
65uacpi_status uacpi_recursive_lock_release(struct uacpi_recursive_lock *lock);
66
67struct uacpi_rw_lock {
68 uacpi_handle read_mutex;
69 uacpi_handle write_mutex;
70 uacpi_size num_readers;
71};
72
73uacpi_status uacpi_rw_lock_init(struct uacpi_rw_lock *lock);
74uacpi_status uacpi_rw_lock_deinit(struct uacpi_rw_lock *lock);
75
76uacpi_status uacpi_rw_lock_read(struct uacpi_rw_lock *lock);
77uacpi_status uacpi_rw_unlock_read(struct uacpi_rw_lock *lock);
78
79uacpi_status uacpi_rw_lock_write(struct uacpi_rw_lock *lock);
80uacpi_status uacpi_rw_unlock_write(struct uacpi_rw_lock *lock);
81
82#endif // !UACPI_BAREBONES_MODE
83