events.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /* Copyright (c) 2013-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #ifndef EVLOOP_EVENTS_H
  4. #define EVLOOP_EVENTS_H
  5. #include "lib/lock/compat_mutex.h"
  6. #include "lib/evloop/compat_libevent.h"
  7. #include "lib/container/smartlist.h"
  8. #include "ext/tor_queue.h"
  9. /* The type of event. */
  10. typedef int64_t event_label_t;
  11. #define EVENT_LABEL_UNSET (-1)
  12. /* Data provided with an event. */
  13. typedef union event_data_t {
  14. void *ptr;
  15. uint64_t u64;
  16. uint16_t u16;
  17. } event_data_t;
  18. /* Object to hold an individual event and associated data. */
  19. typedef struct event_wrapper_t {
  20. TOR_TAILQ_ENTRY(event_wrapper_t) next_event;
  21. event_label_t label;
  22. event_data_t data;
  23. void (*free_data_fn)(void *);
  24. } event_wrapper_t;
  25. /* A list of events and corresponding help strings. */
  26. typedef struct event_registry_t {
  27. tor_mutex_t lock;
  28. smartlist_t *events;
  29. } event_registry_t;
  30. /* An object that publishes events to any subscribed listeners. */
  31. typedef struct event_source_t {
  32. tor_mutex_t lock;
  33. smartlist_t *deliver_silently;
  34. smartlist_t *subscriptions;
  35. } event_source_t;
  36. /* An object that subscribes to a source and processes new events. */
  37. typedef struct event_listener_t {
  38. tor_mutex_t lock;
  39. smartlist_t *callbacks;
  40. TOR_TAILQ_HEAD(pending_events_head_t, event_wrapper_t) pending_events;
  41. bool is_pending;
  42. struct event *eventloop_ev;
  43. void *context;
  44. } event_listener_t;
  45. typedef void (*event_update_fn_t)(event_label_t,
  46. event_data_t *,
  47. event_data_t *);
  48. typedef void (*process_event_fn_t)(event_label_t, event_data_t, void *);
  49. /* Create the event registry. */
  50. event_registry_t *event_registry_new(void);
  51. /* Free the event registry. */
  52. void event_registry_free(event_registry_t *registry);
  53. /* Register a new event and optionally provide a string representation
  54. of the event label. */
  55. event_label_t event_registry_register_event(event_registry_t *registry,
  56. const char *help_label);
  57. /* Get the help label string registered for an event label. */
  58. const char *event_registry_get_help_label(event_registry_t *registry,
  59. event_label_t event_label);
  60. event_listener_t *event_listener_new(void *context);
  61. void event_listener_free(event_listener_t *listener);
  62. void event_listener_attach(event_listener_t *listener, struct event_base *base);
  63. void event_listener_detach(event_listener_t *listener);
  64. void event_listener_set_callback(event_listener_t *listener, event_label_t label,
  65. event_update_fn_t update_fn,
  66. process_event_fn_t process_event_fn);
  67. void event_listener_process(event_listener_t *listener);
  68. /* Create the event source, which publishes events to listeners. */
  69. event_source_t *event_source_new(void);
  70. void event_source_free(event_source_t *source);
  71. void event_source_subscribe(event_source_t *source, event_listener_t *listener,
  72. event_label_t label);
  73. void event_source_unsubscribe(event_source_t *source,
  74. event_listener_t *listener,
  75. event_label_t label);
  76. void event_source_unsubscribe_all(event_source_t *source,
  77. event_listener_t *listener);
  78. void event_source_publish(event_source_t *source, event_label_t label,
  79. event_data_t data, void (*free_data_fn)(void *));
  80. void event_source_deliver_silently(event_source_t *source, event_label_t label,
  81. bool deliver_silently);
  82. void event_source_wakeup_listener(event_source_t *source, event_label_t label);
  83. #endif