Advertisement
Guest User

Untitled

a guest
Aug 29th, 2014
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef events_hh
  2. #define events_hh
  3.  
  4. #include "CThread.h"
  5. #include <queue>
  6.  
  7. class ss_event_base {
  8. int type;
  9. };
  10.  
  11. class ss_event : public ss_event_base {
  12.  
  13.  
  14. };
  15.  
  16. typedef std::queue<ss_event_base *> evt_queue;
  17.  
  18. /*
  19. * RAII mutex class
  20. */
  21. struct mutex_locker
  22. {
  23. mutex_locker(mutex& mutex) : _m(mutex) { _m.lock(); }
  24. ~mutex_locker() { _m.unlock(); }
  25.  
  26. mutex &_m;
  27. };
  28.  
  29. struct event_manager : public CThread
  30. {
  31. static event_manager &get() { static event_manager e; return e; }
  32.  
  33. void enque_event(ss_event_base *e);
  34. private:
  35. event_manager() {}
  36.  
  37. ss_event_base *pop_queue();
  38. void execute(void *parm);
  39.  
  40. private:
  41. mutex em;
  42. evt_queue eq;
  43. };
  44.  
  45. #endif // enets_hh
  46. ---------------
  47.  
  48. /*
  49. * events.cc
  50. *
  51. * unique event processing
  52. *
  53. */
  54.  
  55. #include "events.hh"
  56.  
  57. void event_manager::enque_event(ss_event_base *e)
  58. {
  59. mutex_locker lock(em);
  60.  
  61. eq.push(e);
  62. }
  63.  
  64. /*
  65. * utility function to check the queue with minimal locking
  66. */
  67. ss_event_base *event_manager::pop_queue()
  68. {
  69. mutex_locker lock(em);
  70.  
  71. if (eq.empty()) return 0;
  72.  
  73. ss_event_base *e = eq.front();
  74. eq.pop();
  75.  
  76. return e;
  77. }
  78.  
  79. void event_manager::execute(void *parm)
  80. {
  81. ss_event_base *e;
  82.  
  83. for (;;) {
  84.  
  85. while ((e = pop_queue()) != 0) {
  86.  
  87. /* process the event here */
  88.  
  89. /* delete it eventually */
  90. delete (e);
  91. }
  92.  
  93. usleep(100000);
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement