hloop.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #ifndef HV_LOOP_H_
  2. #define HV_LOOP_H_
  3. #include "hdef.h"
  4. BEGIN_EXTERN_C
  5. typedef struct hloop_s hloop_t;
  6. typedef struct hevent_s hevent_t;
  7. typedef struct hidle_s hidle_t;
  8. typedef struct htimer_s htimer_t;
  9. typedef struct htimeout_s htimeout_t;
  10. typedef struct hperiod_s hperiod_t;
  11. typedef struct hio_s hio_t;
  12. typedef void (*hevent_cb) (hevent_t* ev);
  13. typedef void (*hidle_cb) (hidle_t* idle);
  14. typedef void (*htimer_cb) (htimer_t* timer);
  15. typedef void (*hio_cb) (hio_t* io);
  16. typedef void (*haccept_cb) (hio_t* io);
  17. typedef void (*hconnect_cb) (hio_t* io);
  18. typedef void (*hread_cb) (hio_t* io, void* buf, int readbytes);
  19. typedef void (*hwrite_cb) (hio_t* io, const void* buf, int writebytes);
  20. typedef void (*hclose_cb) (hio_t* io);
  21. typedef enum {
  22. HEVENT_TYPE_NONE = 0,
  23. HEVENT_TYPE_IDLE = 0x00000010,
  24. HEVENT_TYPE_TIMEOUT = 0x00000100,
  25. HEVENT_TYPE_PERIOD = 0x00000200,
  26. HEVENT_TYPE_TIMER = HEVENT_TYPE_TIMEOUT|HEVENT_TYPE_PERIOD,
  27. HEVENT_TYPE_IO = 0x00001000,
  28. } hevent_type_e;
  29. #define HEVENT_LOWEST_PRIORITY (-5)
  30. #define HEVENT_LOW_PRIORITY (-3)
  31. #define HEVENT_NORMAL_PRIORITY 0
  32. #define HEVENT_HIGH_PRIORITY 3
  33. #define HEVENT_HIGHEST_PRIORITY 5
  34. #define HEVENT_PRIORITY_SIZE (HEVENT_HIGHEST_PRIORITY-HEVENT_LOWEST_PRIORITY+1)
  35. #define HEVENT_PRIORITY_INDEX(priority) (priority-HEVENT_LOWEST_PRIORITY)
  36. #define HEVENT_FLAGS \
  37. unsigned destroy :1; \
  38. unsigned active :1; \
  39. unsigned pending :1;
  40. #define HEVENT_FIELDS \
  41. hloop_t* loop; \
  42. hevent_type_e event_type; \
  43. uint64_t event_id; \
  44. hevent_cb cb; \
  45. void* userdata; \
  46. int priority; \
  47. struct hevent_s* pending_next; \
  48. HEVENT_FLAGS
  49. struct hevent_s {
  50. HEVENT_FIELDS
  51. };
  52. #define hevent_set_priority(ev, prio) ((hevent_t*)(ev))->priority = prio
  53. #define hevent_set_userdata(ev, udata) ((hevent_t*)(ev))->userdata = (void*)udata
  54. #define hevent_loop(ev) (((hevent_t*)(ev))->loop)
  55. #define hevent_type(ev) (((hevent_t*)(ev))->event_type)
  56. #define hevent_id(ev) (((hevent_t*)(ev))->event_id)
  57. #define hevent_priority(ev) (((hevent_t*)(ev))->priority)
  58. #define hevent_userdata(ev) (((hevent_t*)(ev))->userdata)
  59. typedef enum {
  60. HIO_TYPE_UNKNOWN = 0,
  61. HIO_TYPE_STDIN = 0x00000001,
  62. HIO_TYPE_STDOUT = 0x00000002,
  63. HIO_TYPE_STDERR = 0x00000004,
  64. HIO_TYPE_STDIO = 0x0000000F,
  65. HIO_TYPE_FILE = 0x00000010,
  66. HIO_TYPE_IP = 0x00000100,
  67. HIO_TYPE_UDP = 0x00001000,
  68. HIO_TYPE_TCP = 0x00010000,
  69. HIO_TYPE_SSL = 0x00020000,
  70. HIO_TYPE_SOCKET = 0x00FFFF00,
  71. } hio_type_e;
  72. // loop
  73. #define HLOOP_FLAG_RUN_ONCE 0x00000001
  74. #define HLOOP_FLAG_AUTO_FREE 0x00000002
  75. hloop_t* hloop_new(int flags DEFAULT(HLOOP_FLAG_AUTO_FREE));
  76. // WARN: Not allow to call hloop_free when HLOOP_INIT_FLAG_AUTO_FREE set.
  77. void hloop_free(hloop_t** pp);
  78. // NOTE: when no active events, loop will quit.
  79. int hloop_run(hloop_t* loop);
  80. int hloop_stop(hloop_t* loop);
  81. int hloop_pause(hloop_t* loop);
  82. int hloop_resume(hloop_t* loop);
  83. void hloop_update_time(hloop_t* loop);
  84. uint64_t hloop_now(hloop_t* loop); // s
  85. uint64_t hloop_now_ms(hloop_t* loop); // ms
  86. uint64_t hloop_now_hrtime(hloop_t* loop); // us
  87. void hloop_set_userdata(hloop_t* loop, void* userdata);
  88. void* hloop_userdata(hloop_t* loop);
  89. // idle
  90. hidle_t* hidle_add(hloop_t* loop, hidle_cb cb, uint32_t repeat DEFAULT(INFINITE));
  91. void hidle_del(hidle_t* idle);
  92. // timer
  93. // @param timeout: unit(ms)
  94. htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, uint64_t timeout, uint32_t repeat DEFAULT(INFINITE));
  95. /*
  96. * minute hour day week month cb
  97. * 0~59 0~23 1~31 0~6 1~12
  98. * 30 -1 -1 -1 -1 cron.hourly
  99. * 30 1 -1 -1 -1 cron.daily
  100. * 30 1 15 -1 -1 cron.monthly
  101. * 30 1 -1 7 -1 cron.weekly
  102. * 30 1 1 -1 10 cron.yearly
  103. */
  104. htimer_t* htimer_add_period(hloop_t* loop, htimer_cb cb,
  105. int8_t minute DEFAULT(0), int8_t hour DEFAULT(-1), int8_t day DEFAULT(-1),
  106. int8_t week DEFAULT(-1), int8_t month DEFAULT(-1), uint32_t repeat DEFAULT(INFINITE));
  107. void htimer_del(htimer_t* timer);
  108. void htimer_reset(htimer_t* timer);
  109. // io
  110. //-----------------------low-level apis---------------------------------------
  111. #define READ_EVENT 0x0001
  112. #define WRITE_EVENT 0x0004
  113. #define ALL_EVENTS READ_EVENT|WRITE_EVENT
  114. hio_t* hio_get(hloop_t* loop, int fd);
  115. int hio_add(hio_t* io, hio_cb cb, int events DEFAULT(READ_EVENT));
  116. int hio_del(hio_t* io, int events DEFAULT(ALL_EVENTS));
  117. int hio_fd (hio_t* io);
  118. int hio_error (hio_t* io);
  119. hio_type_e hio_type(hio_t* io);
  120. struct sockaddr* hio_localaddr(hio_t* io);
  121. struct sockaddr* hio_peeraddr (hio_t* io);
  122. void hio_set_readbuf(hio_t* io, void* buf, size_t len);
  123. // ssl
  124. int hio_enable_ssl(hio_t* io);
  125. void hio_setcb_accept (hio_t* io, haccept_cb accept_cb);
  126. void hio_setcb_connect (hio_t* io, hconnect_cb connect_cb);
  127. void hio_setcb_read (hio_t* io, hread_cb read_cb);
  128. void hio_setcb_write (hio_t* io, hwrite_cb write_cb);
  129. void hio_setcb_close (hio_t* io, hclose_cb close_cb);
  130. // NOTE: don't forget to call hio_set_readbuf
  131. int hio_read (hio_t* io);
  132. int hio_write (hio_t* io, const void* buf, size_t len);
  133. int hio_close (hio_t* io);
  134. int hio_accept (hio_t* io);
  135. int hio_connect(hio_t* io);
  136. //------------------high-level apis-------------------------------------------
  137. // hio_get -> hio_set_readbuf -> hio_setcb_read -> hio_read
  138. hio_t* hread (hloop_t* loop, int fd, void* buf, size_t len, hread_cb read_cb);
  139. // hio_get -> hio_setcb_write -> hio_write
  140. hio_t* hwrite (hloop_t* loop, int fd, const void* buf, size_t len, hwrite_cb write_cb DEFAULT(NULL));
  141. // hio_get -> hio_close
  142. void hclose (hloop_t* loop, int fd);
  143. // tcp
  144. // hio_get -> hio_setcb_accept -> hio_accept
  145. hio_t* haccept (hloop_t* loop, int listenfd, haccept_cb accept_cb);
  146. // hio_get -> hio_setcb_connect -> hio_connect
  147. hio_t* hconnect (hloop_t* loop, int connfd, hconnect_cb connect_cb);
  148. // hio_get -> hio_set_readbuf -> hio_setcb_read -> hio_read
  149. hio_t* hrecv (hloop_t* loop, int connfd, void* buf, size_t len, hread_cb read_cb);
  150. // hio_get -> hio_setcb_write -> hio_write
  151. hio_t* hsend (hloop_t* loop, int connfd, const void* buf, size_t len, hwrite_cb write_cb DEFAULT(NULL));
  152. // udp/ip
  153. // for HIO_TYPE_IP
  154. void hio_set_type(hio_t* io, hio_type_e type);
  155. void hio_set_localaddr(hio_t* io, struct sockaddr* addr, int addrlen);
  156. void hio_set_peeraddr (hio_t* io, struct sockaddr* addr, int addrlen);
  157. // NOTE: must call hio_set_peeraddr before hrecvfrom/hsendto
  158. // hio_get -> hio_set_readbuf -> hio_setcb_read -> hio_read
  159. hio_t* hrecvfrom (hloop_t* loop, int sockfd, void* buf, size_t len, hread_cb read_cb);
  160. // hio_get -> hio_setcb_write -> hio_write
  161. hio_t* hsendto (hloop_t* loop, int sockfd, const void* buf, size_t len, hwrite_cb write_cb DEFAULT(NULL));
  162. //----------------- top-level apis---------------------------------------------
  163. // @tcp_server: socket -> bind -> listen -> haccept
  164. hio_t* create_tcp_server (hloop_t* loop, const char* host, int port, haccept_cb accept_cb);
  165. // @tcp_client: resolver -> socket -> hio_get -> hio_set_peeraddr -> hconnect
  166. hio_t* create_tcp_client (hloop_t* loop, const char* host, int port, hconnect_cb connect_cb);
  167. // @udp_server: socket -> bind -> hio_get
  168. hio_t* create_udp_server (hloop_t* loop, const char* host, int port);
  169. // @udp_client: resolver -> socket -> hio_get -> hio_set_peeraddr
  170. hio_t* create_udp_client (hloop_t* loop, const char* host, int port);
  171. END_EXTERN_C
  172. #endif // HV_LOOP_H_