mirror of
https://github.com/transmission/transmission
synced 2025-02-21 13:46:52 +00:00
refactor: add libtransmission::evhelpers (#4104)
This commit is contained in:
parent
36edd516aa
commit
4d8509c180
15 changed files with 134 additions and 145 deletions
|
@ -286,6 +286,7 @@
|
|||
BE1183700CE160D50002D0F3 /* miniupnpc.c in Sources */ = {isa = PBXBuildFile; fileRef = BE1183680CE160D50002D0F3 /* miniupnpc.c */; };
|
||||
BE1183780CE161390002D0F3 /* libminiupnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE1183480CE160960002D0F3 /* libminiupnp.a */; };
|
||||
BE75C38A0C72A1ED00DBEFE0 /* libevent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE75C3490C729E9500DBEFE0 /* libevent.a */; };
|
||||
BE7AA337F6752914B0C416B0 /* utils-ev.h in Headers */ = {isa = PBXBuildFile; fileRef = BE7AA337F6752914B0C416B1 /* utils-ev.h */; };
|
||||
BEFC1C050C07753500B0BB3C /* libtransmission.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D18389709DEC0030047D688 /* libtransmission.a */; };
|
||||
BEFC1C1A0C07756200B0BB3C /* daemon.cc in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1C0E0C07756200B0BB3C /* daemon.cc */; };
|
||||
BEFC1D050C07825A00B0BB3C /* remote.cc in Sources */ = {isa = PBXBuildFile; fileRef = BEFC1C140C07756200B0BB3C /* remote.cc */; };
|
||||
|
@ -1061,6 +1062,7 @@
|
|||
BE1183670CE160D50002D0F3 /* upnpcommands.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = upnpcommands.c; sourceTree = "<group>"; };
|
||||
BE1183680CE160D50002D0F3 /* miniupnpc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = miniupnpc.c; sourceTree = "<group>"; };
|
||||
BE75C3490C729E9500DBEFE0 /* libevent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libevent.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
BE7AA337F6752914B0C416B1 /* utils-ev.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utils-ev.h; sourceTree = "<group>"; };
|
||||
BEFC1C000C07750000B0BB3C /* transmission-daemon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "transmission-daemon"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
BEFC1C0E0C07756200B0BB3C /* daemon.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = daemon.cc; sourceTree = "<group>"; };
|
||||
BEFC1C140C07756200B0BB3C /* remote.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = remote.cc; sourceTree = "<group>"; };
|
||||
|
@ -1732,6 +1734,7 @@
|
|||
BEFC1DF50C07861A00B0BB3C /* transmission.h */,
|
||||
A24621360C769CF400088E81 /* session-thread.cc */,
|
||||
A24621350C769CF400088E81 /* session-thread.h */,
|
||||
BE7AA337F6752914B0C416B1 /* utils-ev.h */,
|
||||
BEFC1DF40C07861A00B0BB3C /* port-forwarding-upnp.cc */,
|
||||
BEFC1DF30C07861A00B0BB3C /* port-forwarding-upnp.h */,
|
||||
BEFC1DF20C07861A00B0BB3C /* utils.cc */,
|
||||
|
@ -2157,6 +2160,7 @@
|
|||
C1077A51183EB29600634C22 /* file.h in Headers */,
|
||||
BEFC1E290C07861A00B0BB3C /* version.h in Headers */,
|
||||
BEFC1E2A0C07861A00B0BB3C /* utils.h in Headers */,
|
||||
BE7AA337F6752914B0C416B0 /* utils-ev.h in Headers */,
|
||||
BEFC1E2C0C07861A00B0BB3C /* port-forwarding-upnp.h in Headers */,
|
||||
A2AAB65D0DE0CF6200E04DDA /* rpcimpl.h in Headers */,
|
||||
A2AAB65E0DE0CF6200E04DDA /* rpc-server.h in Headers */,
|
||||
|
|
|
@ -209,6 +209,7 @@ set(${PROJECT_NAME}_PRIVATE_HEADERS
|
|||
tr-dht.h
|
||||
tr-lpd.h
|
||||
tr-utp.h
|
||||
utils-ev.h
|
||||
variant-common.h
|
||||
verify.h
|
||||
version.h
|
||||
|
|
|
@ -502,8 +502,8 @@ std::shared_ptr<tr_peerIo> tr_peerIo::create(
|
|||
{
|
||||
case TR_PEER_SOCKET_TYPE_TCP:
|
||||
tr_logAddTraceIo(io, fmt::format("socket (tcp) is {}", socket.handle.tcp));
|
||||
io->event_read = event_new(session->eventBase(), socket.handle.tcp, EV_READ, event_read_cb, io.get());
|
||||
io->event_write = event_new(session->eventBase(), socket.handle.tcp, EV_WRITE, event_write_cb, io.get());
|
||||
io->event_read.reset(event_new(session->eventBase(), socket.handle.tcp, EV_READ, event_read_cb, io.get()));
|
||||
io->event_write.reset(event_new(session->eventBase(), socket.handle.tcp, EV_WRITE, event_write_cb, io.get()));
|
||||
break;
|
||||
|
||||
#ifdef WITH_UTP
|
||||
|
@ -597,12 +597,8 @@ static void event_enable(tr_peerIo* io, short event)
|
|||
TR_ASSERT(io->session != nullptr);
|
||||
|
||||
bool const need_events = io->socket.type == TR_PEER_SOCKET_TYPE_TCP;
|
||||
|
||||
if (need_events)
|
||||
{
|
||||
TR_ASSERT(event_initialized(io->event_read));
|
||||
TR_ASSERT(event_initialized(io->event_write));
|
||||
}
|
||||
TR_ASSERT(!need_events || io->event_read);
|
||||
TR_ASSERT(!need_events || io->event_write);
|
||||
|
||||
if ((event & EV_READ) != 0 && (io->pendingEvents & EV_READ) == 0)
|
||||
{
|
||||
|
@ -610,7 +606,7 @@ static void event_enable(tr_peerIo* io, short event)
|
|||
|
||||
if (need_events)
|
||||
{
|
||||
event_add(io->event_read, nullptr);
|
||||
event_add(io->event_read.get(), nullptr);
|
||||
}
|
||||
|
||||
io->pendingEvents |= EV_READ;
|
||||
|
@ -622,7 +618,7 @@ static void event_enable(tr_peerIo* io, short event)
|
|||
|
||||
if (need_events)
|
||||
{
|
||||
event_add(io->event_write, nullptr);
|
||||
event_add(io->event_write.get(), nullptr);
|
||||
}
|
||||
|
||||
io->pendingEvents |= EV_WRITE;
|
||||
|
@ -632,12 +628,8 @@ static void event_enable(tr_peerIo* io, short event)
|
|||
static void event_disable(tr_peerIo* io, short event)
|
||||
{
|
||||
bool const need_events = io->socket.type == TR_PEER_SOCKET_TYPE_TCP;
|
||||
|
||||
if (need_events)
|
||||
{
|
||||
TR_ASSERT(event_initialized(io->event_read));
|
||||
TR_ASSERT(event_initialized(io->event_write));
|
||||
}
|
||||
TR_ASSERT(!need_events || io->event_read);
|
||||
TR_ASSERT(!need_events || io->event_write);
|
||||
|
||||
if ((event & EV_READ) != 0 && (io->pendingEvents & EV_READ) != 0)
|
||||
{
|
||||
|
@ -645,7 +637,7 @@ static void event_disable(tr_peerIo* io, short event)
|
|||
|
||||
if (need_events)
|
||||
{
|
||||
event_del(io->event_read);
|
||||
event_del(io->event_read.get());
|
||||
}
|
||||
|
||||
io->pendingEvents &= ~EV_READ;
|
||||
|
@ -657,7 +649,7 @@ static void event_disable(tr_peerIo* io, short event)
|
|||
|
||||
if (need_events)
|
||||
{
|
||||
event_del(io->event_write);
|
||||
event_del(io->event_write.get());
|
||||
}
|
||||
|
||||
io->pendingEvents &= ~EV_WRITE;
|
||||
|
@ -708,19 +700,9 @@ static void io_close_socket(tr_peerIo* io)
|
|||
tr_logAddDebugIo(io, fmt::format("unsupported peer socket type {}", io->socket.type));
|
||||
}
|
||||
|
||||
io->event_write.reset();
|
||||
io->event_read.reset();
|
||||
io->socket = {};
|
||||
|
||||
if (io->event_read != nullptr)
|
||||
{
|
||||
event_free(io->event_read);
|
||||
io->event_read = nullptr;
|
||||
}
|
||||
|
||||
if (io->event_write != nullptr)
|
||||
{
|
||||
event_free(io->event_write);
|
||||
io->event_write = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
tr_peerIo::~tr_peerIo()
|
||||
|
@ -773,8 +755,8 @@ int tr_peerIo::reconnect()
|
|||
return -1;
|
||||
}
|
||||
|
||||
this->event_read = event_new(session->eventBase(), this->socket.handle.tcp, EV_READ, event_read_cb, this);
|
||||
this->event_write = event_new(session->eventBase(), this->socket.handle.tcp, EV_WRITE, event_write_cb, this);
|
||||
this->event_read.reset(event_new(session->eventBase(), this->socket.handle.tcp, EV_READ, event_read_cb, this));
|
||||
this->event_write.reset(event_new(session->eventBase(), this->socket.handle.tcp, EV_WRITE, event_write_cb, this));
|
||||
|
||||
event_enable(this, pending_events);
|
||||
this->session->setSocketTOS(this->socket.handle.tcp, addr.type);
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
#include <string>
|
||||
#include <utility> // std::make_pair
|
||||
|
||||
#include <event2/buffer.h>
|
||||
|
||||
#include "transmission.h"
|
||||
|
||||
#include "bandwidth.h"
|
||||
|
@ -32,6 +30,7 @@
|
|||
#include "peer-socket.h"
|
||||
#include "tr-assert.h"
|
||||
#include "tr-buffer.h"
|
||||
#include "utils-ev.h"
|
||||
|
||||
class tr_peerIo;
|
||||
struct tr_bandwidth;
|
||||
|
@ -51,16 +50,6 @@ enum ReadState
|
|||
|
||||
auto inline constexpr PEER_IO_MAGIC_NUMBER = 206745;
|
||||
|
||||
struct evbuffer_deleter
|
||||
{
|
||||
void operator()(struct evbuffer* buf) const noexcept
|
||||
{
|
||||
evbuffer_free(buf);
|
||||
}
|
||||
};
|
||||
|
||||
using tr_evbuffer_ptr = std::unique_ptr<evbuffer, evbuffer_deleter>;
|
||||
|
||||
namespace libtransmission::test
|
||||
{
|
||||
|
||||
|
@ -255,8 +244,8 @@ public:
|
|||
|
||||
std::deque<std::pair<size_t /*n_bytes*/, bool /*is_piece_data*/>> outbuf_info;
|
||||
|
||||
struct event* event_read = nullptr;
|
||||
struct event* event_write = nullptr;
|
||||
libtransmission::evhelpers::event_unique_ptr event_read;
|
||||
libtransmission::evhelpers::event_unique_ptr event_write;
|
||||
|
||||
short int pendingEvents = 0;
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "session-thread.h"
|
||||
#include "tr-assert.h"
|
||||
#include "utils.h" // for tr_net_init()
|
||||
#include "utils-ev.h"
|
||||
|
||||
using namespace std::literals;
|
||||
|
||||
|
@ -135,7 +136,7 @@ auto makeEventBase()
|
|||
{
|
||||
tr_session_thread::tr_evthread_init();
|
||||
|
||||
return std::unique_ptr<event_base, void (*)(event_base*)>{ event_base_new(), event_base_free };
|
||||
return libtransmission::evhelpers::evbase_unique_ptr{ event_base_new() };
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
@ -153,7 +154,7 @@ class tr_session_thread_impl final : public tr_session_thread
|
|||
public:
|
||||
explicit tr_session_thread_impl()
|
||||
: evbase_{ makeEventBase() }
|
||||
, work_queue_event_{ event_new(evbase_.get(), -1, 0, onWorkAvailableStatic, this), event_free }
|
||||
, work_queue_event_{ event_new(evbase_.get(), -1, 0, onWorkAvailableStatic, this) }
|
||||
{
|
||||
auto lock = std::unique_lock(is_looping_mutex_);
|
||||
|
||||
|
@ -273,8 +274,8 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<event_base, void (*)(event_base*)> const evbase_;
|
||||
std::unique_ptr<event, void (*)(event*)> const work_queue_event_;
|
||||
libtransmission::evhelpers::evbase_unique_ptr const evbase_;
|
||||
libtransmission::evhelpers::event_unique_ptr work_queue_event_;
|
||||
|
||||
work_queue_t work_queue_;
|
||||
std::mutex work_queue_mutex_;
|
||||
|
|
|
@ -276,6 +276,7 @@ tr_session::BoundSocket::BoundSocket(
|
|||
: cb_{ cb }
|
||||
, cb_data_{ cb_data }
|
||||
, socket_{ tr_netBindTCP(addr, port, false) }
|
||||
, ev_{ event_new(evbase, socket_, EV_READ | EV_PERSIST, &BoundSocket::onCanRead, this) }
|
||||
{
|
||||
if (socket_ == TR_BAD_SOCKET)
|
||||
{
|
||||
|
@ -284,27 +285,12 @@ tr_session::BoundSocket::BoundSocket(
|
|||
|
||||
tr_logAddInfo(
|
||||
fmt::format(_("Listening to incoming peer connections on {hostport}"), fmt::arg("hostport", addr.readable(port))));
|
||||
|
||||
ev_ = event_new(
|
||||
evbase,
|
||||
socket_,
|
||||
EV_READ | EV_PERSIST,
|
||||
[](evutil_socket_t fd, short /*evtype*/, void* vself)
|
||||
{
|
||||
auto* const self = static_cast<BoundSocket*>(vself);
|
||||
self->cb_(fd, self->cb_data_);
|
||||
},
|
||||
this);
|
||||
event_add(ev_, nullptr);
|
||||
event_add(ev_.get(), nullptr);
|
||||
}
|
||||
|
||||
tr_session::BoundSocket::~BoundSocket()
|
||||
{
|
||||
if (ev_ != nullptr)
|
||||
{
|
||||
event_free(ev_);
|
||||
ev_ = nullptr;
|
||||
}
|
||||
ev_.reset();
|
||||
|
||||
if (socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "stats.h"
|
||||
#include "torrents.h"
|
||||
#include "tr-lpd.h"
|
||||
#include "utils-ev.h"
|
||||
#include "verify.h"
|
||||
#include "web.h"
|
||||
|
||||
|
@ -89,10 +90,16 @@ private:
|
|||
~BoundSocket();
|
||||
|
||||
private:
|
||||
static void onCanRead(evutil_socket_t fd, short /*what*/, void* vself)
|
||||
{
|
||||
auto* const self = static_cast<BoundSocket*>(vself);
|
||||
self->cb_(fd, self->cb_data_);
|
||||
}
|
||||
|
||||
IncomingCallback cb_;
|
||||
void* cb_data_;
|
||||
tr_socket_t socket_ = TR_BAD_SOCKET;
|
||||
struct event* ev_ = nullptr;
|
||||
libtransmission::evhelpers::event_unique_ptr ev_;
|
||||
};
|
||||
|
||||
class AltSpeedMediator final : public tr_session_alt_speeds::Mediator
|
||||
|
@ -254,11 +261,11 @@ private:
|
|||
private:
|
||||
tr_port const udp_port_;
|
||||
tr_session& session_;
|
||||
struct event* udp_event_ = nullptr;
|
||||
struct event* udp6_event_ = nullptr;
|
||||
std::optional<in6_addr> udp6_bound_;
|
||||
tr_socket_t udp_socket_ = TR_BAD_SOCKET;
|
||||
tr_socket_t udp6_socket_ = TR_BAD_SOCKET;
|
||||
libtransmission::evhelpers::event_unique_ptr udp4_event_;
|
||||
libtransmission::evhelpers::event_unique_ptr udp6_event_;
|
||||
std::optional<in6_addr> udp6_bound_;
|
||||
|
||||
void rebind_ipv6(bool);
|
||||
};
|
||||
|
|
|
@ -9,28 +9,12 @@
|
|||
|
||||
#include <event2/event.h>
|
||||
|
||||
#include "tr-assert.h"
|
||||
#include "timer-ev.h"
|
||||
#include "tr-assert.h"
|
||||
#include "utils-ev.h"
|
||||
|
||||
using namespace std::literals;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct EventDeleter
|
||||
{
|
||||
void operator()(struct event* event)
|
||||
{
|
||||
if (event != nullptr)
|
||||
{
|
||||
event_del(event);
|
||||
event_free(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace libtransmission
|
||||
{
|
||||
|
||||
|
@ -118,7 +102,7 @@ private:
|
|||
}
|
||||
|
||||
struct event_base* const base_;
|
||||
std::unique_ptr<struct event, EventDeleter> evtimer_;
|
||||
evhelpers::event_unique_ptr evtimer_;
|
||||
|
||||
std::function<void()> callback_;
|
||||
std::chrono::milliseconds interval_ = 100ms;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include "error.h"
|
||||
#include "net.h" // tr_socket_t
|
||||
#include "utils-ev.h"
|
||||
#include "utils.h"
|
||||
|
||||
namespace libtransmission
|
||||
|
@ -359,7 +360,7 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<evbuffer, void (*)(evbuffer*)> buf_{ evbuffer_new(), evbuffer_free };
|
||||
evhelpers::evbuffer_unique_ptr buf_{ evbuffer_new() };
|
||||
};
|
||||
|
||||
} // namespace libtransmission
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <netinet/in.h> /* sockaddr_in */
|
||||
#endif
|
||||
|
||||
#include <event2/event.h>
|
||||
#include <event2/util.h>
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
@ -32,6 +31,7 @@
|
|||
#include "tr-assert.h"
|
||||
#include "tr-lpd.h"
|
||||
#include "utils.h" // for tr_net_init()
|
||||
#include "utils-ev.h" // for tr_net_init()
|
||||
|
||||
using namespace std::literals;
|
||||
|
||||
|
@ -227,10 +227,7 @@ public:
|
|||
|
||||
~tr_lpd_impl() override
|
||||
{
|
||||
if (event_ != nullptr)
|
||||
{
|
||||
event_free(event_);
|
||||
}
|
||||
event_.reset();
|
||||
|
||||
if (mcast_rcv_socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
|
@ -382,8 +379,8 @@ private:
|
|||
/* Note: lpd_unsolicitedMsgCounter remains 0 until the first timeout event, thus
|
||||
* any announcement received during the initial interval will be discarded. */
|
||||
|
||||
event_ = event_new(event_base, mcast_rcv_socket_, EV_READ | EV_PERSIST, event_callback, this);
|
||||
event_add(event_, nullptr);
|
||||
event_.reset(event_new(event_base, mcast_rcv_socket_, EV_READ | EV_PERSIST, event_callback, this));
|
||||
event_add(event_.get(), nullptr);
|
||||
|
||||
tr_logAddDebug("Local Peer Discovery initialised");
|
||||
|
||||
|
@ -571,7 +568,7 @@ private:
|
|||
Mediator& mediator_;
|
||||
tr_socket_t mcast_rcv_socket_ = TR_BAD_SOCKET; /**<separate multicast receive socket */
|
||||
tr_socket_t mcast_snd_socket_ = TR_BAD_SOCKET; /**<and multicast send socket */
|
||||
event* event_ = nullptr;
|
||||
libtransmission::evhelpers::event_unique_ptr event_;
|
||||
|
||||
static auto constexpr MaxDatagramLength = size_t{ 1400 };
|
||||
sockaddr_in mcast_addr_ = {}; /**<initialized from the above constants in init() */
|
||||
|
|
|
@ -275,12 +275,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
|
|||
}
|
||||
else
|
||||
{
|
||||
udp_event_ = event_new(session_.eventBase(), udp_socket_, EV_READ | EV_PERSIST, event_callback, &session_);
|
||||
|
||||
if (udp_event_ == nullptr)
|
||||
{
|
||||
tr_logAddWarn(_("Couldn't allocate IPv4 event"));
|
||||
}
|
||||
udp4_event_.reset(event_new(session_.eventBase(), udp_socket_, EV_READ | EV_PERSIST, event_callback, &session_));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,12 +288,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
|
|||
|
||||
if (udp6_socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
udp6_event_ = event_new(session_.eventBase(), udp6_socket_, EV_READ | EV_PERSIST, event_callback, &session_);
|
||||
|
||||
if (udp6_event_ == nullptr)
|
||||
{
|
||||
tr_logAddWarn(_("Couldn't allocate IPv6 event"));
|
||||
}
|
||||
udp6_event_.reset(event_new(session_.eventBase(), udp6_socket_, EV_READ | EV_PERSIST, event_callback, &session_));
|
||||
}
|
||||
|
||||
set_socket_buffers();
|
||||
|
@ -309,13 +299,13 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
|
|||
tr_dhtInit(&session_, udp_socket_, udp6_socket_);
|
||||
}
|
||||
|
||||
if (udp_event_ != nullptr)
|
||||
if (udp4_event_)
|
||||
{
|
||||
event_add(udp_event_, nullptr);
|
||||
event_add(udp4_event_.get(), nullptr);
|
||||
}
|
||||
if (udp6_event_ != nullptr)
|
||||
if (udp6_event_)
|
||||
{
|
||||
event_add(udp6_event_, nullptr);
|
||||
event_add(udp6_event_.get(), nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -339,17 +329,7 @@ tr_session::tr_udp_core::~tr_udp_core()
|
|||
{
|
||||
startShutdown();
|
||||
|
||||
if (udp_socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
tr_netCloseSocket(udp_socket_);
|
||||
udp_socket_ = TR_BAD_SOCKET;
|
||||
}
|
||||
|
||||
if (udp_event_ != nullptr)
|
||||
{
|
||||
event_free(udp_event_);
|
||||
udp_event_ = nullptr;
|
||||
}
|
||||
udp6_event_.reset();
|
||||
|
||||
if (udp6_socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
|
@ -357,10 +337,12 @@ tr_session::tr_udp_core::~tr_udp_core()
|
|||
udp6_socket_ = TR_BAD_SOCKET;
|
||||
}
|
||||
|
||||
if (udp6_event_ != nullptr)
|
||||
udp4_event_.reset();
|
||||
|
||||
if (udp_socket_ != TR_BAD_SOCKET)
|
||||
{
|
||||
event_free(udp6_event_);
|
||||
udp6_event_ = nullptr;
|
||||
tr_netCloseSocket(udp_socket_);
|
||||
udp_socket_ = TR_BAD_SOCKET;
|
||||
}
|
||||
|
||||
udp6_bound_.reset();
|
||||
|
|
60
libtransmission/utils-ev.h
Normal file
60
libtransmission/utils-ev.h
Normal file
|
@ -0,0 +1,60 @@
|
|||
// This file Copyright © 2022 Mnemosyne LLC.
|
||||
// It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
||||
// or any future license endorsed by Mnemosyne LLC.
|
||||
// License text can be found in the licenses/ folder.
|
||||
|
||||
#ifndef __TRANSMISSION__
|
||||
#error only libtransmission should #include this header.
|
||||
#endif
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <event2/buffer.h>
|
||||
#include <event2/event.h>
|
||||
|
||||
namespace libtransmission::evhelpers
|
||||
{
|
||||
|
||||
struct BufferDeleter
|
||||
{
|
||||
void operator()(struct evbuffer* buf) const noexcept
|
||||
{
|
||||
if (buf != nullptr)
|
||||
{
|
||||
evbuffer_free(buf);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
using evbuffer_unique_ptr = std::unique_ptr<struct evbuffer, BufferDeleter>;
|
||||
|
||||
struct EventBaseDeleter
|
||||
{
|
||||
void operator()(struct event_base* evbase) const noexcept
|
||||
{
|
||||
if (evbase != nullptr)
|
||||
{
|
||||
event_base_free(evbase);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
using evbase_unique_ptr = std::unique_ptr<struct event_base, EventBaseDeleter>;
|
||||
|
||||
struct EventDeleter
|
||||
{
|
||||
void operator()(struct event* event)
|
||||
{
|
||||
if (event != nullptr)
|
||||
{
|
||||
event_del(event);
|
||||
event_free(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
using event_unique_ptr = std::unique_ptr<struct event, EventDeleter>;
|
||||
|
||||
} // namespace libtransmission::evhelpers
|
|
@ -28,6 +28,7 @@
|
|||
#include "log.h"
|
||||
#include "tr-strbuf.h"
|
||||
#include "utils.h" // for _()
|
||||
#include "utils-ev.h"
|
||||
#include "watchdir-base.h"
|
||||
|
||||
namespace libtransmission
|
||||
|
@ -51,11 +52,7 @@ public:
|
|||
|
||||
~KQueueWatchdir() override
|
||||
{
|
||||
if (event_ != nullptr)
|
||||
{
|
||||
event_del(event_);
|
||||
event_free(event_);
|
||||
}
|
||||
event_.reset();
|
||||
|
||||
if (kq_ != -1)
|
||||
{
|
||||
|
@ -112,8 +109,8 @@ private:
|
|||
}
|
||||
|
||||
// create libevent task for event descriptor
|
||||
event_ = event_new(evbase, kq_, EV_READ | EV_ET | EV_PERSIST, &onKqueueEvent, this);
|
||||
if (event_ == nullptr)
|
||||
event_.reset(event_new(evbase, kq_, EV_READ | EV_ET | EV_PERSIST, &onKqueueEvent, this));
|
||||
if (!event_)
|
||||
{
|
||||
auto const error_code = errno;
|
||||
tr_logAddError(fmt::format(
|
||||
|
@ -123,7 +120,7 @@ private:
|
|||
return;
|
||||
}
|
||||
|
||||
if (event_add(event_, nullptr) == -1)
|
||||
if (event_add(event_.get(), nullptr) == -1)
|
||||
{
|
||||
auto const error_code = errno;
|
||||
tr_logAddError(fmt::format(
|
||||
|
@ -158,7 +155,7 @@ private:
|
|||
|
||||
int kq_ = -1;
|
||||
int dirfd_ = -1;
|
||||
struct event* event_ = nullptr;
|
||||
libtransmission::evhelpers::event_unique_ptr event_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <event2/buffer.h>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <fmt/format.h>
|
||||
|
||||
|
@ -30,6 +28,7 @@
|
|||
#include "log.h"
|
||||
#include "peer-io.h"
|
||||
#include "tr-assert.h"
|
||||
#include "utils-ev.h"
|
||||
#include "utils.h"
|
||||
#include "web.h"
|
||||
|
||||
|
@ -180,7 +179,7 @@ public:
|
|||
class Task
|
||||
{
|
||||
private:
|
||||
tr_evbuffer_ptr const privbuf = tr_evbuffer_ptr{ evbuffer_new() };
|
||||
libtransmission::evhelpers::evbuffer_unique_ptr privbuf{ evbuffer_new() };
|
||||
std::unique_ptr<CURL, void (*)(CURL*)> const easy_handle{ curl_easy_init(), curl_easy_cleanup };
|
||||
tr_web::FetchOptions options;
|
||||
|
||||
|
|
|
@ -13,8 +13,6 @@
|
|||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <event2/buffer.h>
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
||||
#include "transmission.h"
|
||||
|
@ -25,6 +23,7 @@
|
|||
#include "peer-mgr.h"
|
||||
#include "timer.h"
|
||||
#include "torrent.h"
|
||||
#include "utils-ev.h"
|
||||
#include "utils.h"
|
||||
#include "web-utils.h"
|
||||
#include "web.h"
|
||||
|
@ -42,7 +41,7 @@ void on_idle(tr_webseed* w);
|
|||
class tr_webseed_task
|
||||
{
|
||||
private:
|
||||
tr_evbuffer_ptr const content_{ evbuffer_new() };
|
||||
libtransmission::evhelpers::evbuffer_unique_ptr const content_{ evbuffer_new() };
|
||||
|
||||
public:
|
||||
tr_webseed_task(tr_torrent* tor, tr_webseed* webseed_in, tr_block_span_t blocks_in)
|
||||
|
@ -328,7 +327,7 @@ private:
|
|||
struct write_block_data
|
||||
{
|
||||
private:
|
||||
tr_evbuffer_ptr const content_{ evbuffer_new() };
|
||||
libtransmission::evhelpers::evbuffer_unique_ptr const content_{ evbuffer_new() };
|
||||
|
||||
public:
|
||||
write_block_data(
|
||||
|
|
Loading…
Reference in a new issue