hloop.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #ifndef HW_LOOP_H_
  2. #define HW_LOOP_H_
  3. #include <map>
  4. #ifndef INFINITE
  5. #define INFINITE (uint32_t)-1
  6. #endif
  7. typedef struct hloop_s hloop_t;
  8. typedef struct htimer_s htimer_t;
  9. typedef struct hidle_s hidle_t;
  10. typedef struct hevent_s hevent_t;
  11. typedef void (*htimer_cb)(htimer_t* timer, void* userdata);
  12. typedef void (*hidle_cb)(hidle_t* idle, void* userdata);
  13. typedef void (*hevent_cb)(hevent_t* event, void* userdata);
  14. typedef enum {
  15. HLOOP_STATUS_STOP,
  16. HLOOP_STATUS_RUNNING,
  17. HLOOP_STATUS_PAUSE
  18. } hloop_status_e;
  19. struct hloop_s {
  20. hloop_status_e status;
  21. uint64_t start_time;
  22. uint64_t end_time;
  23. uint64_t cur_time;
  24. uint64_t loop_cnt;
  25. // timers
  26. uint32_t timer_counter;
  27. // timer_id => timer
  28. std::map<int, htimer_t*> timers;
  29. uint32_t min_timer_timeout;
  30. // idles
  31. uint32_t idle_counter;
  32. // hidle_id => idle
  33. std::map<int, hidle_t*> idles;
  34. // events
  35. // fd => event
  36. std::map<int, hevent_t*> events;
  37. void* event_ctx; // private
  38. };
  39. struct htimer_s {
  40. hloop_t* loop;
  41. uint32_t timer_id;
  42. uint32_t timeout;
  43. uint32_t repeat;
  44. htimer_cb cb;
  45. void* userdata;
  46. //private:
  47. unsigned destroy :1;
  48. unsigned disable :1;
  49. uint64_t next_timeout;
  50. };
  51. struct hidle_s {
  52. hloop_t* loop;
  53. uint32_t idle_id;
  54. uint32_t repeat;
  55. hidle_cb cb;
  56. void* userdata;
  57. //private:
  58. unsigned destroy :1;
  59. unsigned disable :1;
  60. };
  61. typedef union {
  62. void* ptr;
  63. uint32_t u32;
  64. uint64_t u64;
  65. } hevent_data_e;
  66. struct hevent_s {
  67. hloop_t* loop;
  68. int fd;
  69. hevent_cb read_cb;
  70. void* read_userdata;
  71. hevent_cb write_cb;
  72. void* write_userdata;
  73. //private:
  74. unsigned destroy :1;
  75. unsigned disable :1;
  76. unsigned accept :1;
  77. unsigned connect :1;
  78. unsigned readable :1;
  79. unsigned writeable :1;
  80. int event_index[2]; // for poll,kqueue
  81. int events; // for epoll
  82. };
  83. // loop
  84. int hloop_init(hloop_t* loop);
  85. //void hloop_cleanup(hloop_t* loop);
  86. int hloop_run(hloop_t* loop);
  87. int hloop_stop(hloop_t* loop);
  88. int hloop_pause(hloop_t* loop);
  89. int hloop_resume(hloop_t* loop);
  90. // timer
  91. // @param timeout: unit(ms)
  92. htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, void* userdata, uint64_t timeout, uint32_t repeat = INFINITE);
  93. void htimer_del(hloop_t* loop, uint32_t timer_id);
  94. void htimer_del(htimer_t* timer);
  95. // idle
  96. hidle_t* hidle_add(hloop_t* loop, hidle_cb cb, void* userdata, uint32_t repeat = INFINITE);
  97. void hidle_del(hloop_t* loop, uint32_t idle_id);
  98. void hidle_del(hidle_t* idle);
  99. // event
  100. // NOTE: READ_EVENT is FOREVER
  101. // NOTE: WRITE_EVENT is ONESHOT
  102. hevent_t* hevent_accept(hloop_t* loop, int listenfd, hevent_cb on_accept, void* userdata);
  103. hevent_t* hevent_connect(hloop_t* loop, int connfd, hevent_cb on_connect, void* userdata);
  104. hevent_t* hevent_read(hloop_t* loop, int fd, hevent_cb on_readable, void* userdata);
  105. hevent_t* hevent_write(hloop_t* loop, int fd, hevent_cb on_writeable, void* userdata);
  106. void hevent_del(hloop_t* loop, int fd);
  107. void hevent_del(hevent_t* event);
  108. #endif // HW_LOOP_H_