#include #include #include #include static inline bool __zv_event_already_set(zv_event_t *target) { return target->type != ZV_EVENT_EMPTY; } static bool __zv_event_push_content( zv_kernel_t *self, zv_tid_t target_tid, zv_event_type_t type, zv_event_content_t content ) { zv_task_t *target_task = __zv_kernel_get_task(self, target_tid); if (target_task == NULL) { return false; } zv_event_t *target_event = &target_task->event; if (__zv_event_already_set(target_event)) { return false; } target_event->content = content; target_event->type = type; return true; } bool zv_event_push_number( struct zv_kernel_s *self, zv_tid_t target, int64_t content ) { return __zv_event_push_content( self, target, ZV_EVENT_DATA, (zv_event_content_t) {.number = content} ); } bool zv_event_push_unumber( struct zv_kernel_s *self, zv_tid_t target, uint64_t content ) { return __zv_event_push_content( self, target, ZV_EVENT_UDATA, (zv_event_content_t) {.unumber = content} ); } bool zv_event_set_timer( struct zv_kernel_s *self, zv_tid_t target, zv_time_t delay ) { zv_time_t result_time = zv_time_after(zv_time_get_time(), delay); return __zv_event_push_content( self, target, ZV_EVENT_TIMER_PHRASE_FIRST, (zv_event_content_t) {.time = result_time} ); } bool zv_event_push_object( struct zv_kernel_s *self, zv_tid_t target, void *content ) { return __zv_event_push_content( self, target, ZV_EVENT_OBJECT, (zv_event_content_t) {.object = content} ); }