async.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "async.h"
  2. namespace bbAsync{
  3. typedef std::chrono::duration<double> secs_t;
  4. typedef std::chrono::high_resolution_clock clock_t;
  5. typedef std::chrono::time_point<clock_t,secs_t> time_t;
  6. struct DelayedEvent{
  7. DelayedEvent *succ;
  8. Event *event;
  9. time_t time;
  10. };
  11. DelayedEvent *que;
  12. DelayedEvent *free_que;
  13. std::mutex que_mutex;
  14. std::condition_variable que_condvar;
  15. void initQue(){
  16. static bool inited;
  17. if( inited ) return;
  18. inited=true;
  19. std::thread( [](){
  20. std::unique_lock<std::mutex> lock( que_mutex );
  21. for(;;){
  22. if( que ){
  23. que_condvar.wait_for( lock,que->time-clock_t::now() );
  24. }else{
  25. que_condvar.wait( lock );
  26. }
  27. //prevent spamming...?
  28. time_t now=clock_t::now();
  29. while( que && que->time<=now ){
  30. DelayedEvent *devent=que;
  31. devent->event->post();
  32. que=devent->succ;
  33. devent->succ=free_que;
  34. free_que=devent;
  35. }
  36. }
  37. } ).detach();
  38. }
  39. void (*postEventFilter)( Event* );
  40. void setPostEventFilter( void(*filter)(Event*) ){
  41. postEventFilter=filter;
  42. }
  43. void Event::post(){
  44. postEventFilter( this );
  45. }
  46. void Event::post( double delay ){
  47. time_t now=clock_t::now();
  48. initQue();
  49. {
  50. std::unique_lock<std::mutex> lock( que_mutex );
  51. DelayedEvent *devent=free_que;
  52. if( devent ){
  53. free_que=devent->succ;
  54. }else{
  55. devent=new DelayedEvent;
  56. }
  57. devent->event=this;
  58. devent->time=now+secs_t( delay );
  59. DelayedEvent *succ,**pred=&que;
  60. while( succ=*pred ){
  61. if( devent->time<succ->time ) break;
  62. pred=&succ->succ;
  63. }
  64. devent->succ=succ;
  65. *pred=devent;
  66. }
  67. que_condvar.notify_one();
  68. }
  69. }