delay_manager.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. /*
  31. int delay_manager_t::get_timer_fd()
  32. {
  33. return timer_fd;
  34. }*/
  35. //int add(my_time_t delay,const dest_t &dest,const char *data,int len);
  36. int delay_manager_t::add(my_time_t delay,const dest_t &dest,char *data,int len)
  37. {
  38. delay_data_t delay_data;
  39. delay_data.dest=dest;
  40. //delay_data.data=data;
  41. delay_data.len=len;
  42. if(capacity!=0&&int(delay_mp.size()) >=capacity)
  43. {
  44. mylog(log_warn,"max pending packet reached,ignored\n");
  45. return -1;
  46. }
  47. if(delay==0)
  48. {
  49. static char buf[buf_len];
  50. delay_data.data=buf;
  51. memcpy(buf,data,len);
  52. int ret=delay_data.handle();
  53. if (ret != 0) {
  54. mylog(log_trace, "handle() return %d\n", ret);
  55. }
  56. return 0;
  57. }
  58. delay_data_t tmp=delay_data;
  59. tmp.data=(char *)malloc(delay_data.len+100);
  60. if(!tmp.data)
  61. {
  62. mylog(log_warn, "malloc() returned null in delay_manager_t::add()");
  63. return -1;
  64. }
  65. memcpy(tmp.data,data,delay_data.len);
  66. my_time_t tmp_time=get_current_time_us();
  67. tmp_time+=delay;
  68. delay_mp.insert(make_pair(tmp_time,tmp));
  69. ////check(); check everytime when add, is it better ??
  70. return 0;
  71. }
  72. int delay_manager_t::check()
  73. {
  74. if(!delay_mp.empty())
  75. {
  76. my_time_t current_time;
  77. multimap<my_time_t,delay_data_t>::iterator it;
  78. while(1)
  79. {
  80. int ret=0;
  81. it=delay_mp.begin();
  82. if(it==delay_mp.end()) break;
  83. current_time=get_current_time_us();
  84. if(it->first <= current_time)
  85. {
  86. ret=it->second.handle();
  87. if (ret != 0) {
  88. mylog(log_trace, "handle() return %d\n", ret);
  89. }
  90. free(it->second.data);
  91. delay_mp.erase(it);
  92. }
  93. else
  94. {
  95. break;
  96. }
  97. }
  98. if(!delay_mp.empty())
  99. {
  100. const double m=1000*1000;
  101. double timer_value=delay_mp.begin()->first/m -get_current_time_us()/m; // be aware of negative value, and be aware of uint
  102. if(timer_value<0) timer_value=0; // set it to 0 if negative, although libev support negative value
  103. ev_timer_stop(loop, &timer);
  104. ev_timer_set(&timer, timer_value,0 );
  105. ev_timer_start(loop, &timer);
  106. }
  107. else
  108. {
  109. ev_timer_stop(loop, &timer); //not necessary
  110. }
  111. }
  112. return 0;
  113. }