ilewis | f1fa93d | 2015-11-09 09:01:11 -0800 | [diff] [blame] | 1 | // 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 Marble | 3313558 | 2016-01-28 10:29:23 -0800 | [diff] [blame] | 10 | #include <evhtp.h> |
| 11 | #include <event2/event.h> |
| 12 | #include <event2/event_struct.h> |
| 13 | #include <openssl/ssl.h> |
ilewis | f1fa93d | 2015-11-09 09:01:11 -0800 | [diff] [blame] | 14 | |
| 15 | namespace weave { |
| 16 | namespace examples { |
| 17 | |
| 18 | // Defines overloaded deletion methods for various event_ objects |
| 19 | // so we can use one unique_ptr definition for all of them |
| 20 | class EventDeleter { |
| 21 | public: |
Jacob Marble | 3313558 | 2016-01-28 10:29:23 -0800 | [diff] [blame] | 22 | 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); } |
ilewis | f1fa93d | 2015-11-09 09:01:11 -0800 | [diff] [blame] | 35 | 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 | |
| 42 | template <typename T> |
| 43 | using EventPtr = std::unique_ptr<T, EventDeleter>; |
| 44 | |
| 45 | } // namespace examples |
| 46 | } // namespace weave |
| 47 | |
| 48 | #endif // LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H |