event.c 1.8 KB

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