blob: 9bb53f4e1fd394a23314eeb3ace01507c669b566 [file] [log] [blame]
ilewisf1fa93d2015-11-09 09:01:11 -08001// Copyright 2015 The Weave Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H
6#define LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H
7
8#include <memory>
9
Jacob Marble33135582016-01-28 10:29:23 -080010#include <evhtp.h>
11#include <event2/event.h>
12#include <event2/event_struct.h>
13#include <openssl/ssl.h>
ilewisf1fa93d2015-11-09 09:01:11 -080014
15namespace weave {
16namespace examples {
17
18// Defines overloaded deletion methods for various event_ objects
19// so we can use one unique_ptr definition for all of them
20class EventDeleter {
21 public:
Jacob Marble33135582016-01-28 10:29:23 -080022 void operator()(evbuffer* buf) { evbuffer_free(buf); }
23 void operator()(evhtp_t* evhtp) {
24 if (evhtp->ssl_ctx) {
25 // Work around a double-free bug in recent versions of libevhtp.
26 // https://github.com/ellzey/libevhtp/pull/208
27 SSL_CTX_free(evhtp->ssl_ctx);
28 evhtp->ssl_ctx = nullptr;
29 }
30 evhtp_unbind_socket(evhtp);
31 evhtp_free(evhtp);
32 }
33 void operator()(evhtp_connection_t* conn) { evhtp_connection_free(conn); }
34 void operator()(evhtp_request_t* req) { evhtp_request_free(req); }
ilewisf1fa93d2015-11-09 09:01:11 -080035 void operator()(event_base* base) { event_base_free(base); }
36 void operator()(event* ev) {
37 event_del(ev);
38 event_free(ev);
39 }
40};
41
42template <typename T>
43using EventPtr = std::unique_ptr<T, EventDeleter>;
44
45} // namespace examples
46} // namespace weave
47
48#endif // LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H