events.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. } event_data_t;
  17. /* Object to hold an individual event and associated data. */
  18. typedef struct event_wrapper_t {
  19. TOR_TAILQ_ENTRY(event_wrapper_t) next_event;
  20. event_label_t label;
  21. event_data_t data;
  22. void (*free_data_fn)(void *);
  23. } event_wrapper_t;
  24. /* A list of events and corresponding help strings. */
  25. typedef struct event_registry_t {
  26. tor_mutex_t lock;
  27. smartlist_t *events;
  28. } event_registry_t;
  29. /* An object that publishes events to any subscribed listeners. */
  30. typedef struct event_source_t {
  31. tor_mutex_t lock;
  32. smartlist_t *subscriptions;
  33. } event_source_t;
  34. /* An object that subscribes to a source and processes new events. */
  35. typedef struct event_listener_t {
  36. tor_mutex_t lock;
  37. smartlist_t *callbacks;
  38. TOR_TAILQ_HEAD(, event_wrapper_t) pending_events;
  39. bool is_pending;
  40. struct event *eventloop_ev;
  41. void *context;
  42. } event_listener_t;
  43. /* Create the event registry. */
  44. event_registry_t *event_registry_new(void);
  45. /* Free the event registry. */
  46. void event_registry_free(event_registry_t *registry);
  47. /* Register a new event and optionally provide a string representation
  48. of the event label. */
  49. event_label_t event_registry_register_event(event_registry_t *registry,
  50. const char *help_label);
  51. /* Get the help label string registered for an event label. */
  52. const char *event_registry_get_help_label(event_registry_t *registry,
  53. event_label_t event_label);
  54. event_listener_t *event_listener_new(void *context);
  55. void event_listener_free(event_listener_t *listener);
  56. void event_listener_attach(event_listener_t *listener, struct event_base *base);
  57. void event_listener_detach(event_listener_t *listener);
  58. void event_listener_set_callback(event_listener_t *listener, event_label_t label,
  59. bool edge_triggered,
  60. void (*process_event_fn)(event_label_t,
  61. event_data_t,
  62. void *));
  63. void event_listener_process(event_listener_t *listener);
  64. /* Create the event source, which publishes events to listeners. */
  65. event_source_t *event_source_new(void);
  66. void event_source_free(event_source_t *source);
  67. void event_source_subscribe(event_source_t *source, event_listener_t *listener,
  68. event_label_t label, bool send_full_event);
  69. void event_source_unsubscribe(event_source_t *source,
  70. event_listener_t *listener,
  71. event_label_t label);
  72. void event_source_unsubscribe_all(event_source_t *source,
  73. event_listener_t *listener);
  74. void event_source_publish(event_source_t *source, event_label_t label,
  75. event_data_t data, void (*free_data_fn)(void *));
  76. #endif