delay_manager.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * delay_manager.h
  3. *
  4. * Created on: Sep 15, 2017
  5. * Author: root
  6. */
  7. #ifndef DELAY_MANAGER_H_
  8. #define DELAY_MANAGER_H_
  9. #include "common.h"
  10. #include "packet.h"
  11. #include "log.h"
  12. // enum delay_type_t {none=0,enum_sendto_u64,enum_send_fd,client_to_local,client_to_remote,server_to_local,server_to_remote};
  13. /*
  14. struct fd_ip_port_t
  15. {
  16. int fd;
  17. u32_t ip;
  18. u32_t port;
  19. };
  20. union dest_t
  21. {
  22. fd_ip_port_t fd_ip_port;
  23. int fd;
  24. u64_t u64;
  25. };
  26. */
  27. /*
  28. struct my_timer_t
  29. {
  30. int timer_fd;
  31. fd64_t timer_fd64;
  32. my_timer_t()
  33. {
  34. if ((timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) < 0)
  35. {
  36. mylog(log_fatal,"timer_fd create error");
  37. myexit(1);
  38. }
  39. timer_fd64=fd_manager.create(timer_fd);
  40. }
  41. my_timer_t(const my_timer_t &b)
  42. {
  43. assert(0==1);
  44. }
  45. ~my_timer_t()
  46. {
  47. fd_manager.fd64_close(timer_fd64);
  48. }
  49. int add_fd_to_epoll(int epoll_fd)
  50. {
  51. epoll_event ev;;
  52. ev.events = EPOLLIN;
  53. ev.data.u64 = timer_fd;
  54. int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
  55. if (ret!= 0) {
  56. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  57. myexit(-1);
  58. }
  59. return 0;
  60. }
  61. int add_fd64_to_epoll(int epoll_fd)
  62. {
  63. epoll_event ev;;
  64. ev.events = EPOLLIN;
  65. ev.data.u64 = timer_fd64;
  66. int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
  67. if (ret!= 0) {
  68. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  69. myexit(-1);
  70. }
  71. return 0;
  72. }
  73. int get_timer_fd()
  74. {
  75. return timer_fd;
  76. }
  77. fd64_t get_timer_fd64()
  78. {
  79. return timer_fd64;
  80. }
  81. int set_timer_repeat_us(my_time_t my_time)
  82. {
  83. itimerspec its;
  84. memset(&its,0,sizeof(its));
  85. its.it_interval.tv_sec=my_time/1000000llu;
  86. its.it_interval.tv_nsec=my_time%1000000llu*1000llu;
  87. its.it_value.tv_nsec=1; //imidiately
  88. timerfd_settime(timer_fd,0,&its,0);
  89. return 0;
  90. }
  91. int set_timer_abs_us(my_time_t my_time)
  92. {
  93. itimerspec its;
  94. memset(&its,0,sizeof(its));
  95. its.it_value.tv_sec=my_time/1000000llu;
  96. its.it_value.tv_nsec=my_time%1000000llu*1000llu;
  97. timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
  98. return 0;
  99. }
  100. };*/
  101. struct delay_data_t {
  102. dest_t dest;
  103. // int left_time;//
  104. char *data;
  105. int len;
  106. int handle();
  107. };
  108. struct delay_manager_t {
  109. ev_timer timer;
  110. struct ev_loop *loop = 0;
  111. void (*cb)(struct ev_loop *loop, struct ev_timer *watcher, int revents) = 0;
  112. // int timer_fd;
  113. int capacity;
  114. multimap<my_time_t, delay_data_t> delay_mp; // unit us,1 us=0.001ms
  115. delay_manager_t();
  116. delay_manager_t(delay_manager_t &b) {
  117. assert(0 == 1);
  118. }
  119. void set_loop_and_cb(struct ev_loop *loop, void (*cb)(struct ev_loop *loop, struct ev_timer *watcher, int revents)) {
  120. this->loop = loop;
  121. this->cb = cb;
  122. ev_init(&timer, cb);
  123. }
  124. int set_capacity(int a) {
  125. capacity = a;
  126. return 0;
  127. }
  128. ~delay_manager_t();
  129. ev_timer &get_timer();
  130. int check();
  131. int add(my_time_t delay, const dest_t &dest, char *data, int len);
  132. };
  133. #endif /* DELAY_MANAGER_H_ */