hevent.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef HW_EVENT_H_
  2. #define HW_EVENT_H_
  3. #include "hloop.h"
  4. #include "hdef.h"
  5. #define EVENT_ENTRY(p) container_of(p, hevent_t, pending_node)
  6. #define IDLE_ENTRY(p) container_of(p, hidle_t, node)
  7. #define TIMER_ENTRY(p) container_of(p, htimer_t, node)
  8. #define EVENT_ACTIVE(ev) \
  9. if (!ev->active) {\
  10. ev->active = 1;\
  11. ev->loop->nactives++;\
  12. }\
  13. #define EVENT_INACTIVE(ev) \
  14. if (ev->active) {\
  15. ev->active = 0;\
  16. ev->loop->nactives--;\
  17. }\
  18. #define EVENT_PENDING(ev) \
  19. do {\
  20. if (!ev->pending) {\
  21. ev->pending = 1;\
  22. ev->loop->npendings++;\
  23. hevent_t** phead = &ev->loop->pendings[HEVENT_PRIORITY_INDEX(ev->priority)];\
  24. ev->pending_next = *phead;\
  25. *phead = (hevent_t*)ev;\
  26. }\
  27. } while(0)
  28. #define EVENT_ADD(loop, ev, cb) \
  29. do {\
  30. ev->loop = loop;\
  31. ev->event_id = ++loop->event_counter;\
  32. ev->cb = (hevent_cb)cb;\
  33. EVENT_ACTIVE(ev);\
  34. } while(0)
  35. #define EVENT_DEL(ev) \
  36. do {\
  37. EVENT_INACTIVE(ev);\
  38. if (!ev->pending) {\
  39. SAFE_FREE(ev);\
  40. }\
  41. } while(0)
  42. #define EVENT_RESET(ev) \
  43. do {\
  44. ev->destroy = 0;\
  45. ev->active = 1;\
  46. ev->pending = 0;\
  47. } while(0)
  48. #endif // HW_EVENT_H_