|
@@ -605,6 +605,24 @@ static smartlist_t *queued_control_events = NULL;
|
|
|
* queued_control_events. */
|
|
|
static struct event *flush_queued_events_event = NULL;
|
|
|
|
|
|
+void
|
|
|
+control_initialize_event_queue(void)
|
|
|
+{
|
|
|
+ if (queued_control_events == NULL) {
|
|
|
+ queued_control_events = smartlist_new();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (flush_queued_events_event == NULL) {
|
|
|
+ struct event_base *b = tor_libevent_get_base();
|
|
|
+ if (b) {
|
|
|
+ flush_queued_events_event = tor_event_new(b,
|
|
|
+ -1, 0, flush_queued_events_cb,
|
|
|
+ NULL);
|
|
|
+ tor_assert(flush_queued_events_event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/** Helper: inserts an event on the list of events queued to be sent to
|
|
|
* one or more controllers, and schedules the events to be flushed if needed.
|
|
|
*
|
|
@@ -619,10 +637,6 @@ static struct event *flush_queued_events_event = NULL;
|
|
|
MOCK_IMPL(STATIC void,
|
|
|
queue_control_event_string,(uint16_t event, char *msg))
|
|
|
{
|
|
|
- if (PREDICT_UNLIKELY(queued_control_events == NULL)) {
|
|
|
- queued_control_events = smartlist_new();
|
|
|
- }
|
|
|
-
|
|
|
/* This is redundant with checks done elsewhere, but it's a last-ditch
|
|
|
* attempt to avoid queueing something we shouldn't have to queue. */
|
|
|
if (PREDICT_UNLIKELY( ! EVENT_IS_INTERESTING(event) )) {
|
|
@@ -634,27 +648,21 @@ queue_control_event_string,(uint16_t event, char *msg))
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- /* No queueing an event while queueing an event */
|
|
|
- ++block_event_queue;
|
|
|
-
|
|
|
queued_event_t *ev = tor_malloc(sizeof(*ev));
|
|
|
ev->event = event;
|
|
|
ev->msg = msg;
|
|
|
|
|
|
+ /* No queueing an event while queueing an event */
|
|
|
+ ++block_event_queue;
|
|
|
+
|
|
|
+ tor_assert(queued_control_events);
|
|
|
smartlist_add(queued_control_events, ev);
|
|
|
|
|
|
/* We just put the first event on the queue; mark the queue to be
|
|
|
* flushed.
|
|
|
*/
|
|
|
if (smartlist_len(queued_control_events) == 1) {
|
|
|
- if (PREDICT_UNLIKELY(flush_queued_events_event == NULL)) {
|
|
|
- struct event_base *b = tor_libevent_get_base();
|
|
|
- tor_assert(b);
|
|
|
- flush_queued_events_event = tor_event_new(b,
|
|
|
- -1, 0, flush_queued_events_cb,
|
|
|
- NULL);
|
|
|
- tor_assert(flush_queued_events_event);
|
|
|
- }
|
|
|
+ tor_assert(flush_queued_events_event);
|
|
|
event_active(flush_queued_events_event, EV_READ, 1);
|
|
|
}
|
|
|
|