123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include <kernel.h>
- #include <sys/notify.h>
- int sys_notify_validate(struct sys_notify *notify)
- {
- int rv = 0;
- if (notify == NULL) {
- return -EINVAL;
- }
-
- switch (sys_notify_get_method(notify)) {
- case SYS_NOTIFY_METHOD_SPINWAIT:
- break;
- case SYS_NOTIFY_METHOD_CALLBACK:
- if (notify->method.callback == NULL) {
- rv = -EINVAL;
- }
- break;
- #ifdef CONFIG_POLL
- case SYS_NOTIFY_METHOD_SIGNAL:
- if (notify->method.signal == NULL) {
- rv = -EINVAL;
- }
- break;
- #endif
- default:
- rv = -EINVAL;
- break;
- }
-
- if (rv == 0) {
- notify->result = 0;
- }
- return rv;
- }
- sys_notify_generic_callback sys_notify_finalize(struct sys_notify *notify,
- int res)
- {
- struct k_poll_signal *sig = NULL;
- sys_notify_generic_callback rv = NULL;
- uint32_t method = sys_notify_get_method(notify);
-
- notify->result = res;
- switch (method) {
- case SYS_NOTIFY_METHOD_SPINWAIT:
- break;
- case SYS_NOTIFY_METHOD_CALLBACK:
- rv = notify->method.callback;
- break;
- case SYS_NOTIFY_METHOD_SIGNAL:
- sig = notify->method.signal;
- break;
- default:
- __ASSERT_NO_MSG(false);
- }
-
- compiler_barrier();
- notify->flags = SYS_NOTIFY_METHOD_COMPLETED;
- if (IS_ENABLED(CONFIG_POLL) && (sig != NULL)) {
- k_poll_signal_raise(sig, res);
- }
- return rv;
- }
|