delay_manager.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. struct my_timer_t
  28. {
  29. int timer_fd;
  30. fd64_t timer_fd64;
  31. my_timer_t()
  32. {
  33. if ((timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) < 0)
  34. {
  35. mylog(log_fatal,"timer_fd create error");
  36. myexit(1);
  37. }
  38. timer_fd64=fd_manager.create(timer_fd);
  39. }
  40. my_timer_t(const my_timer_t &b)
  41. {
  42. assert(0==1);
  43. }
  44. ~my_timer_t()
  45. {
  46. fd_manager.fd64_close(timer_fd64);
  47. }
  48. int add_fd_to_epoll(int epoll_fd)
  49. {
  50. epoll_event ev;;
  51. ev.events = EPOLLIN;
  52. ev.data.u64 = timer_fd;
  53. int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
  54. if (ret!= 0) {
  55. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  56. myexit(-1);
  57. }
  58. return 0;
  59. }
  60. int add_fd64_to_epoll(int epoll_fd)
  61. {
  62. epoll_event ev;;
  63. ev.events = EPOLLIN;
  64. ev.data.u64 = timer_fd64;
  65. int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, timer_fd, &ev);
  66. if (ret!= 0) {
  67. mylog(log_fatal,"add delay_manager.get_timer_fd() error\n");
  68. myexit(-1);
  69. }
  70. return 0;
  71. }
  72. int get_timer_fd()
  73. {
  74. return timer_fd;
  75. }
  76. fd64_t get_timer_fd64()
  77. {
  78. return timer_fd64;
  79. }
  80. int set_timer_repeat_us(my_time_t my_time)
  81. {
  82. itimerspec its;
  83. memset(&its,0,sizeof(its));
  84. its.it_interval.tv_sec=my_time/1000000llu;
  85. its.it_interval.tv_nsec=my_time%1000000llu*1000llu;
  86. its.it_value.tv_nsec=1; //imidiately
  87. timerfd_settime(timer_fd,0,&its,0);
  88. return 0;
  89. }
  90. int set_timer_abs_us(my_time_t my_time)
  91. {
  92. itimerspec its;
  93. memset(&its,0,sizeof(its));
  94. its.it_value.tv_sec=my_time/1000000llu;
  95. its.it_value.tv_nsec=my_time%1000000llu*1000llu;
  96. timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
  97. return 0;
  98. }
  99. };
  100. struct delay_data_t
  101. {
  102. dest_t dest;
  103. //int left_time;//
  104. char * data;
  105. int len;
  106. int handle();
  107. };
  108. struct delay_manager_t
  109. {
  110. int timer_fd;
  111. int capacity;
  112. multimap<my_time_t,delay_data_t> delay_mp; //unit us,1 us=0.001ms
  113. delay_manager_t();
  114. delay_manager_t(delay_manager_t &b)
  115. {
  116. assert(0==1);
  117. }
  118. ~delay_manager_t();
  119. int get_timer_fd();
  120. int check();
  121. int add(my_time_t delay,const dest_t &dest,char *data,int len);
  122. };
  123. #endif /* DELAY_MANAGER_H_ */