// Copyright 2015 The Weave Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H #define LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H #include #include #include #include #include namespace weave { namespace examples { // Defines overloaded deletion methods for various event_ objects // so we can use one unique_ptr definition for all of them class EventDeleter { public: void operator()(evbuffer* buf) { evbuffer_free(buf); } void operator()(evhtp_t* evhtp) { if (evhtp->ssl_ctx) { // Work around a double-free bug in recent versions of libevhtp. // https://github.com/ellzey/libevhtp/pull/208 SSL_CTX_free(evhtp->ssl_ctx); evhtp->ssl_ctx = nullptr; } evhtp_unbind_socket(evhtp); evhtp_free(evhtp); } void operator()(evhtp_connection_t* conn) { evhtp_connection_free(conn); } void operator()(evhtp_request_t* req) { evhtp_request_free(req); } void operator()(event_base* base) { event_base_free(base); } void operator()(event* ev) { event_del(ev); event_free(ev); } }; template using EventPtr = std::unique_ptr; } // namespace examples } // namespace weave #endif // LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H