delay_manager.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * delay_manager.cpp
  3. *
  4. * Created on: Sep 15, 2017
  5. * Author: root
  6. */
  7. #include "delay_manager.h"
  8. #include "log.h"
  9. #include "packet.h"
  10. int delay_data_t::handle()
  11. {
  12. return my_send(dest,data,len)>=0;
  13. }
  14. delay_manager_t::delay_manager_t()
  15. {
  16. capacity=0;
  17. if ((timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) < 0)
  18. {
  19. mylog(log_fatal,"timer_fd create error");
  20. myexit(1);
  21. }
  22. itimerspec zero_its;
  23. memset(&zero_its, 0, sizeof(zero_its));
  24. timerfd_settime(timer_fd, TFD_TIMER_ABSTIME, &zero_its, 0);
  25. }
  26. delay_manager_t::~delay_manager_t()
  27. {
  28. //TODO ,we currently dont need to deconstruct it
  29. }
  30. int delay_manager_t::get_timer_fd()
  31. {
  32. return timer_fd;
  33. }
  34. //int add(my_time_t delay,const dest_t &dest,const char *data,int len);
  35. int delay_manager_t::add(my_time_t delay,const dest_t &dest,char *data,int len)
  36. {
  37. delay_data_t delay_data;
  38. delay_data.dest=dest;
  39. delay_data.data=data;
  40. delay_data.len=len;
  41. if(capacity!=0&&int(delay_mp.size()) >=capacity)
  42. {
  43. mylog(log_warn,"max pending packet reached,ignored\n");
  44. return -1;
  45. }
  46. if(delay==0)
  47. {
  48. int ret=delay_data.handle();
  49. if (ret != 0) {
  50. mylog(log_debug, "handle() return %d\n", ret);
  51. }
  52. return 0;
  53. }
  54. delay_data_t tmp=delay_data;
  55. tmp.data=(char *)malloc(delay_data.len);
  56. memcpy(tmp.data,delay_data.data,delay_data.len);
  57. my_time_t tmp_time=get_current_time_us();
  58. tmp_time+=delay;
  59. delay_mp.insert(make_pair(tmp_time,tmp));
  60. return 0;
  61. }
  62. int delay_manager_t::check()
  63. {
  64. if(!delay_mp.empty())
  65. {
  66. my_time_t current_time;
  67. multimap<my_time_t,delay_data_t>::iterator it;
  68. while(1)
  69. {
  70. int ret=0;
  71. it=delay_mp.begin();
  72. if(it==delay_mp.end()) break;
  73. current_time=get_current_time_us();
  74. if(it->first <= current_time)
  75. {
  76. ret=it->second.handle();
  77. if (ret != 0) {
  78. mylog(log_debug, "handle() return %d\n", ret);
  79. }
  80. free(it->second.data);
  81. delay_mp.erase(it);
  82. }
  83. else
  84. {
  85. break;
  86. }
  87. }
  88. if(!delay_mp.empty())
  89. {
  90. itimerspec its;
  91. memset(&its.it_interval,0,sizeof(its.it_interval));
  92. its.it_value.tv_sec=delay_mp.begin()->first/1000000llu;
  93. its.it_value.tv_nsec=(delay_mp.begin()->first%1000000llu)*1000llu;
  94. timerfd_settime(timer_fd,TFD_TIMER_ABSTIME,&its,0);
  95. }
  96. }
  97. return 0;
  98. }