48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
// 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 <memory>
|
|
|
|
#include <evhtp.h>
|
|
#include <event2/event.h>
|
|
#include <event2/event_struct.h>
|
|
#include <openssl/ssl.h>
|
|
|
|
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 <typename T>
|
|
using EventPtr = std::unique_ptr<T, EventDeleter>;
|
|
|
|
} // namespace examples
|
|
} // namespace weave
|
|
|
|
#endif // LIBWEAVE_EXAMPLES_PROVIDER_EVENT_DELETER_H
|