ReactOS 0.4.16-dev-1946-g52006dd
notify.c
Go to the documentation of this file.
8#include <uacpi/kernel_api.h>
9
10#ifndef UACPI_BAREBONES_MODE
11
13
15{
19
20 return UACPI_STATUS_OK;
21}
22
24{
27
29}
30
35};
36
38{
41 uacpi_free(ctx, sizeof(*ctx));
42}
43
44static void do_notify(uacpi_handle opaque)
45{
46 struct notification_ctx *ctx = opaque;
48 uacpi_bool did_notify_root = UACPI_FALSE;
49
50 handler = ctx->node_object->handlers->notify_head;
51
52 for (;;) {
53 if (handler == UACPI_NULL) {
54 if (did_notify_root) {
56 return;
57 }
58
59 handler = g_uacpi_rt_ctx.root_object->handlers->notify_head;
60 did_notify_root = UACPI_TRUE;
61 continue;
62 }
63
64 handler->callback(handler->user_context, ctx->node, ctx->value);
65 handler = handler->next;
66 }
67}
68
70{
72 struct notification_ctx *ctx;
74
78 );
81
84 return ret;
85
87 g_uacpi_rt_ctx.root_object->handlers->notify_head == UACPI_NULL) {
89 goto out;
90 }
91
92 ctx = uacpi_kernel_alloc(sizeof(*ctx));
95 goto out;
96 }
97
98 ctx->node = node;
99 // In case this node goes out of scope
101
102 ctx->value = value;
104 uacpi_object_ref(ctx->node_object);
105
108 uacpi_warn("unable to schedule notification work: %s\n",
111 }
112
113out:
115 return ret;
116}
117
120)
121{
123
124 while (handler) {
125 if (handler->callback == target_handler)
126 return handler;
127
128 handler = handler->next;
129 }
130
131 return UACPI_NULL;
132}
133
136 uacpi_handle handler_context
137)
138{
142 uacpi_device_notify_handler *new_handler;
143
145
146 if (node == uacpi_namespace_root()) {
147 obj = g_uacpi_rt_ctx.root_object;
148 } else {
152 );
154 return ret;
155 }
156
159 goto out_no_mutex;
160
162
163 handlers = obj->handlers;
164
167 goto out;
168 }
169
170 new_handler = uacpi_kernel_alloc_zeroed(sizeof(*new_handler));
171 if (uacpi_unlikely(new_handler == UACPI_NULL))
173
174 new_handler->callback = handler;
175 new_handler->user_context = handler_context;
176 new_handler->next = handlers->notify_head;
177
178 handlers->notify_head = new_handler;
179
180out:
182out_no_mutex:
183 if (node != uacpi_namespace_root())
185
186 return ret;
187}
188
191)
192{
196 uacpi_device_notify_handler *prev_handler, *containing = UACPI_NULL;
197
199
200 if (node == uacpi_namespace_root()) {
201 obj = g_uacpi_rt_ctx.root_object;
202 } else {
206 );
208 return ret;
209 }
210
213 goto out_no_mutex;
214
216
217 handlers = obj->handlers;
218
219 containing = handler_container(handlers, handler);
220 if (containing == UACPI_NULL) {
222 goto out;
223 }
224
225 prev_handler = handlers->notify_head;
226
227 // Are we the last linked handler?
228 if (prev_handler == containing) {
229 handlers->notify_head = containing->next;
230 goto out;
231 }
232
233 // Nope, we're somewhere in the middle. Do a search.
234 while (prev_handler) {
235 if (prev_handler->next == containing) {
236 prev_handler->next = containing->next;
237 goto out;
238 }
239
240 prev_handler = prev_handler->next;
241 }
242
243out:
245out_no_mutex:
246 if (node != uacpi_namespace_root())
248
250 uacpi_free(containing, sizeof(*containing));
251
252 return ret;
253}
254
255#endif // !UACPI_BAREBONES_MODE
static uacpi_status uacpi_release_native_mutex(uacpi_handle mtx)
Definition: mutex.h:25
static uacpi_status uacpi_acquire_native_mutex(uacpi_handle mtx)
Definition: mutex.h:13
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17
#define uacpi_warn(...)
Definition: log.h:20
void uacpi_namespace_node_unref(uacpi_namespace_node *node)
Definition: namespace.c:297
uacpi_object * uacpi_namespace_node_get_object_typed(const uacpi_namespace_node *node, uacpi_object_type_bits type_mask)
Definition: namespace.c:654
uacpi_object * uacpi_namespace_node_get_object(const uacpi_namespace_node *node)
Definition: namespace.c:646
uacpi_status uacpi_namespace_node_release_object(uacpi_object *obj)
Definition: namespace.c:747
uacpi_status uacpi_namespace_node_acquire_object_typed(const uacpi_namespace_node *node, uacpi_object_type_bits, uacpi_object **out_obj)
Definition: namespace.c:670
#define uacpi_kernel_alloc_zeroed
Definition: stdlib.h:127
#define uacpi_free(mem, _)
Definition: stdlib.h:96
uacpi_namespace_node * uacpi_namespace_root(void)
Definition: namespace.c:267
#define uacpi_unlikely(expr)
Definition: compiler.h:58
bool uacpi_bool
Definition: types.h:31
#define UACPI_FALSE
Definition: types.h:30
uint64_t uacpi_u64
Definition: types.h:22
#define UACPI_NULL
Definition: types.h:33
#define UACPI_TRUE
Definition: types.h:29
#define uacpi_likely_success(expr)
Definition: status.h:53
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_NOT_FOUND
Definition: status.h:17
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
@ UACPI_STATUS_ALREADY_EXISTS
Definition: status.h:20
@ UACPI_STATUS_OK
Definition: status.h:11
@ UACPI_STATUS_NO_HANDLER
Definition: status.h:25
const uacpi_char * uacpi_status_to_string(uacpi_status)
Definition: uacpi.c:50
void uacpi_object_ref(uacpi_object *obj)
Definition: types.c:727
uacpi_status(* uacpi_notify_handler)(uacpi_handle context, uacpi_namespace_node *node, uacpi_u64 value)
Definition: types.h:508
@ UACPI_OBJECT_PROCESSOR_BIT
Definition: types.h:140
@ UACPI_OBJECT_THERMAL_ZONE_BIT
Definition: types.h:141
@ UACPI_OBJECT_DEVICE_BIT
Definition: types.h:134
@ UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED
Definition: types.h:66
void uacpi_object_unref(uacpi_object *obj)
Definition: types.c:755
return ret
Definition: mutex.c:146
static void do_notify(uacpi_handle opaque)
Definition: notify.c:44
static uacpi_device_notify_handler * handler_container(uacpi_handlers *handlers, uacpi_notify_handler target_handler)
Definition: notify.c:118
uacpi_status uacpi_uninstall_notify_handler(uacpi_namespace_node *node, uacpi_notify_handler handler)
Definition: notify.c:189
static void free_notification_ctx(struct notification_ctx *ctx)
Definition: notify.c:37
void uacpi_deinitialize_notify(void)
Definition: notify.c:23
uacpi_status uacpi_install_notify_handler(uacpi_namespace_node *node, uacpi_notify_handler handler, uacpi_handle handler_context)
Definition: notify.c:134
uacpi_status uacpi_initialize_notify(void)
Definition: notify.c:14
static uacpi_handle notify_mutex
Definition: notify.c:12
uacpi_status uacpi_notify_all(uacpi_namespace_node *node, uacpi_u64 value)
Definition: notify.c:69
static xmlCharEncodingHandlerPtr * handlers
Definition: encoding.c:1317
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
uacpi_status uacpi_kernel_wait_for_work_completion(void)
Definition: uacpiosl.c:235
uacpi_status uacpi_kernel_schedule_work(uacpi_work_type, uacpi_work_handler, uacpi_handle ctx)
Definition: uacpiosl.c:228
uacpi_handle uacpi_kernel_create_mutex(void)
Definition: uacpiosl.c:139
void uacpi_kernel_free_mutex(uacpi_handle)
Definition: uacpiosl.c:146
@ UACPI_WORK_NOTIFICATION
Definition: kernel_api.h:349
uacpi_u32 uacpi_shareable_ref(uacpi_handle)
Definition: shareable.c:31
uacpi_namespace_node * node
Definition: notify.c:32
uacpi_u64 value
Definition: notify.c:33
uacpi_object * node_object
Definition: notify.c:34
struct uacpi_device_notify_handler * next
Definition: types.h:95
uacpi_notify_handler callback
Definition: types.h:93
uacpi_handle user_context
Definition: types.h:94
uacpi_device_notify_handler * notify_head
Definition: types.h:107
uacpi_handlers * handlers
Definition: types.h:267
Definition: dlist.c:348
Definition: pdh_main.c:96
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383