#include #include #include #include "zv_types.h" #include "kernel.h" #include "task.h" #include "event.h" #include "zv_time.h" static inline bool __zv_event_empty(zv_event_t *self) { return self->type == ZV_EVENT_EMPTY; } bool zv_event_push_number( struct zv_kernel_s *self, zv_tid_t target, int64_t content ) { zv_task_t *task = __zv_kernel_get_task(self, target); zv_event_t *event = &task->event; if (!__zv_event_empty(event)) { return false; } event->type = ZV_EVENT_DATA; event->content.number = content; return true; } bool zv_event_push_unumber( struct zv_kernel_s *self, zv_tid_t target, uint64_t content ) { zv_task_t *task = __zv_kernel_get_task(self, target); zv_event_t *event = &task->event; if (!__zv_event_empty(event)) { return false; } event->type = ZV_EVENT_DATA; event->content.unumber = content; return true; } bool zv_event_set_timer( struct zv_kernel_s *self, zv_tid_t target, zv_time_t time ) { zv_task_t *task = __zv_kernel_get_task(self, target); zv_event_t *event = &task->event; if (!__zv_event_empty(event)) { return false; } zv_time_t current_time = zv_platform_get_time(); zv_time_t final_time = current_time + time; event->type = ZV_EVENT_TIMER; event->content.time = final_time; return true; } bool zv_event_push_object( struct zv_kernel_s *self, zv_tid_t target, void *content ) { if (content == NULL) { return false; } zv_task_t *task = __zv_kernel_get_task(self, target); zv_event_t *event = &task->event; if (!__zv_event_empty(event)) { return false; } event->type = ZV_EVENT_OBJECT; event->content.object = content; return true; }