hevent.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 TIMER_HEAP_ENTRY(p) container_of(p, htimer_t, hnode)
  9. #define EVENT_ACTIVE(ev) \
  10. if (!ev->active) {\
  11. ev->active = 1;\
  12. ev->loop->nactives++;\
  13. }\
  14. #define EVENT_INACTIVE(ev) \
  15. if (ev->active) {\
  16. ev->active = 0;\
  17. ev->loop->nactives--;\
  18. }\
  19. #define EVENT_PENDING(ev) \
  20. do {\
  21. if (!ev->pending) {\
  22. ev->pending = 1;\
  23. ev->loop->npendings++;\
  24. hevent_t** phead = &ev->loop->pendings[HEVENT_PRIORITY_INDEX(ev->priority)];\
  25. if (*phead == NULL) {\
  26. *phead = (hevent_t*)ev;\
  27. } else {\
  28. ev->pending_next = *phead;\
  29. *phead = (hevent_t*)ev;\
  30. }\
  31. }\
  32. } while(0)
  33. #define EVENT_ADD(loop, ev, cb) \
  34. do {\
  35. ev->loop = loop;\
  36. ev->event_id = ++loop->event_counter;\
  37. ev->cb = (hevent_cb)cb;\
  38. EVENT_ACTIVE(ev);\
  39. } while(0)
  40. #define EVENT_DEL(ev) \
  41. do {\
  42. EVENT_INACTIVE(ev);\
  43. ev->destroy = 1;\
  44. } while(0)
  45. #endif // HW_EVENT_H_