async.cpp 1.6 KB

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