event.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <zivuos.h>
  2. #include <stddef.h>
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. static inline bool __zv_event_already_set(zv_event_t *target) {
  6. return target->type != ZV_EVENT_EMPTY;
  7. }
  8. static bool __zv_event_push_content(
  9. zv_kernel_t *self,
  10. zv_tid_t target_tid,
  11. zv_event_type_t type,
  12. zv_event_content_t content
  13. ) {
  14. zv_task_t *target_task = __zv_kernel_get_task(self, target_tid);
  15. if (target_task == NULL) {
  16. return false;
  17. }
  18. zv_event_t *target_event = &target_task->event;
  19. if (__zv_event_already_set(target_event)) {
  20. return false;
  21. }
  22. target_event->content = content;
  23. target_event->type = type;
  24. return true;
  25. }
  26. bool zv_event_push_number(
  27. struct zv_kernel_s *self,
  28. zv_tid_t target,
  29. int64_t content
  30. ) {
  31. return __zv_event_push_content(
  32. self,
  33. target,
  34. ZV_EVENT_DATA,
  35. (zv_event_content_t) {.number = content}
  36. );
  37. }
  38. bool zv_event_push_unumber(
  39. struct zv_kernel_s *self,
  40. zv_tid_t target,
  41. uint64_t content
  42. ) {
  43. return __zv_event_push_content(
  44. self,
  45. target,
  46. ZV_EVENT_UDATA,
  47. (zv_event_content_t) {.unumber = content}
  48. );
  49. }
  50. bool zv_event_set_timer(
  51. struct zv_kernel_s *self,
  52. zv_tid_t target,
  53. zv_time_t delay
  54. ) {
  55. zv_time_t result_time = zv_time_after(zv_time_get_time(), delay);
  56. return __zv_event_push_content(
  57. self,
  58. target,
  59. ZV_EVENT_TIMER_PHRASE_FIRST,
  60. (zv_event_content_t) {.time = result_time}
  61. );
  62. }
  63. bool zv_event_push_object(
  64. struct zv_kernel_s *self,
  65. zv_tid_t target,
  66. void *content
  67. ) {
  68. return __zv_event_push_content(
  69. self,
  70. target,
  71. ZV_EVENT_OBJECT,
  72. (zv_event_content_t) {.object = content}
  73. );
  74. }