events.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. int max_iterations;
  45. } event_listener_t;
  46. typedef void (*event_update_fn_t)(event_label_t,
  47. event_data_t *,
  48. event_data_t *);
  49. typedef void (*process_event_fn_t)(event_label_t, event_data_t, void *);
  50. /* Create the event registry. */
  51. event_registry_t *event_registry_new(void);
  52. /* Free the event registry. */
  53. void event_registry_free(event_registry_t *registry);
  54. /* Register a new event and optionally provide a string representation
  55. of the event label. */
  56. event_label_t event_registry_register_event(event_registry_t *registry,
  57. const char *help_label);
  58. /* Get the help label string registered for an event label. */
  59. const char *event_registry_get_help_label(event_registry_t *registry,
  60. event_label_t event_label);
  61. event_listener_t *event_listener_new(void *context);
  62. void event_listener_free(event_listener_t *listener);
  63. void event_listener_set_max_iterations(event_listener_t *listener,
  64. int max_iterations);
  65. void event_listener_attach(event_listener_t *listener, struct event_base *base);
  66. void event_listener_detach(event_listener_t *listener);
  67. void event_listener_set_callback(event_listener_t *listener, event_label_t label,
  68. event_update_fn_t update_fn,
  69. process_event_fn_t process_event_fn);
  70. void event_listener_process(event_listener_t *listener);
  71. /* Create the event source, which publishes events to listeners. */
  72. event_source_t *event_source_new(void);
  73. void event_source_free(event_source_t *source);
  74. void event_source_subscribe(event_source_t *source, event_listener_t *listener,
  75. event_label_t label);
  76. void event_source_unsubscribe(event_source_t *source,
  77. event_listener_t *listener,
  78. event_label_t label);
  79. void event_source_unsubscribe_all(event_source_t *source,
  80. event_listener_t *listener);
  81. void event_source_publish(event_source_t *source, event_label_t label,
  82. event_data_t data, void (*free_data_fn)(void *));
  83. void event_source_deliver_silently(event_source_t *source, event_label_t label,
  84. bool deliver_silently);
  85. void event_source_wakeup_listener(event_source_t *source, event_label_t label);
  86. #endif