refactor: use std::mutex in ArchNetworkBSD

This commit is contained in:
sithlord48 2025-06-10 20:48:51 -04:00 committed by Nick Bolton
parent d535593d1d
commit fa1ee0690e
2 changed files with 21 additions and 31 deletions

View file

@ -93,16 +93,9 @@ void ArchNetworkBSD::Deps::testCancelThread()
// ArchNetworkBSD // ArchNetworkBSD
// //
ArchNetworkBSD::~ArchNetworkBSD()
{
if (m_mutex)
ARCH->closeMutex(m_mutex);
}
void ArchNetworkBSD::init() void ArchNetworkBSD::init()
{ {
// create mutex to make some calls thread safe // do nothing
m_mutex = ARCH->newMutex();
} }
ArchSocket ArchNetworkBSD::newSocket(EAddressFamily family, ESocketType type) ArchSocket ArchNetworkBSD::newSocket(EAddressFamily family, ESocketType type)
@ -131,9 +124,8 @@ ArchSocket ArchNetworkBSD::copySocket(ArchSocket s)
assert(s != nullptr); assert(s != nullptr);
// ref the socket and return it // ref the socket and return it
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
++s->m_refCount; ++s->m_refCount;
ARCH->unlockMutex(m_mutex);
return s; return s;
} }
@ -141,19 +133,22 @@ void ArchNetworkBSD::closeSocket(ArchSocket s)
{ {
assert(s != nullptr); assert(s != nullptr);
bool doClose = false;
// unref the socket and note if it should be released // unref the socket and note if it should be released
ARCH->lockMutex(m_mutex); {
const bool doClose = (--s->m_refCount == 0); std::lock_guard<std::mutex> lock(m_mutex);
ARCH->unlockMutex(m_mutex); doClose = (--s->m_refCount == 0);
}
// close the socket if necessary // close the socket if necessary
if (doClose) { if (doClose) {
if (close(s->m_fd) == -1) { if (close(s->m_fd) == -1) {
// close failed. restore the last ref and throw. // close failed. restore the last ref and throw.
int err = errno; int err = errno;
ARCH->lockMutex(m_mutex); {
++s->m_refCount; std::lock_guard<std::mutex> lock(m_mutex);
ARCH->unlockMutex(m_mutex); ++s->m_refCount;
}
throwError(err); throwError(err);
} }
delete s; delete s;
@ -536,11 +531,10 @@ std::vector<ArchNetAddress> ArchNetworkBSD::nameToAddr(const std::string &name)
} }
// done with static buffer // done with static buffer
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
struct addrinfo *pResult = nullptr; struct addrinfo *pResult = nullptr;
if (int ret = getaddrinfo(name.c_str(), nullptr, &hints, &pResult); ret != 0) { if (int ret = getaddrinfo(name.c_str(), nullptr, &hints, &pResult); ret != 0) {
ARCH->unlockMutex(m_mutex);
throwNameError(ret); throwNameError(ret);
} }
@ -558,7 +552,6 @@ std::vector<ArchNetAddress> ArchNetworkBSD::nameToAddr(const std::string &name)
} }
freeaddrinfo(pResult); freeaddrinfo(pResult);
ARCH->unlockMutex(m_mutex);
return addresses; return addresses;
} }
@ -575,23 +568,19 @@ std::string ArchNetworkBSD::addrToName(ArchNetAddress addr)
assert(addr != nullptr); assert(addr != nullptr);
// mutexed name lookup (ugh) // mutexed name lookup (ugh)
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
char host[1024]; char host[1024];
char service[20]; char service[20];
if (int ret = if (int ret =
getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0); getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0);
ret != 0) { ret != 0) {
ARCH->unlockMutex(m_mutex);
throwNameError(ret); throwNameError(ret);
} }
// save (primary) name // save (primary) name
std::string name = host; std::string name = host;
// done with static buffer
ARCH->unlockMutex(m_mutex);
return name; return name;
} }
@ -602,18 +591,18 @@ std::string ArchNetworkBSD::addrToString(ArchNetAddress addr)
switch (getAddrFamily(addr)) { switch (getAddrFamily(addr)) {
case kINET: { case kINET: {
const auto *ipAddr = TYPED_ADDR(struct sockaddr_in, addr); const auto *ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
std::string s = inet_ntoa(ipAddr->sin_addr); std::string s = inet_ntoa(ipAddr->sin_addr);
ARCH->unlockMutex(m_mutex);
return s; return s;
} }
case kINET6: { case kINET6: {
char strAddr[INET6_ADDRSTRLEN]; char strAddr[INET6_ADDRSTRLEN];
const auto *ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); const auto *ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
ARCH->lockMutex(m_mutex); {
inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN); std::lock_guard<std::mutex> lock(m_mutex);
ARCH->unlockMutex(m_mutex); inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN);
}
return strAddr; return strAddr;
} }

View file

@ -11,6 +11,7 @@
#include "arch/IArchNetwork.h" #include "arch/IArchNetwork.h"
#include <memory> #include <memory>
#include <mutex>
#include <poll.h> #include <poll.h>
#include <sys/socket.h> #include <sys/socket.h>
@ -62,7 +63,7 @@ public:
} }
ArchNetworkBSD(ArchNetworkBSD const &) = delete; ArchNetworkBSD(ArchNetworkBSD const &) = delete;
ArchNetworkBSD(ArchNetworkBSD &&) = delete; ArchNetworkBSD(ArchNetworkBSD &&) = delete;
~ArchNetworkBSD() override; ~ArchNetworkBSD() = default;
ArchNetworkBSD &operator=(ArchNetworkBSD const &) = delete; ArchNetworkBSD &operator=(ArchNetworkBSD const &) = delete;
ArchNetworkBSD &operator=(ArchNetworkBSD &&) = delete; ArchNetworkBSD &operator=(ArchNetworkBSD &&) = delete;
@ -108,5 +109,5 @@ private:
private: private:
std::shared_ptr<Deps> m_pDeps; std::shared_ptr<Deps> m_pDeps;
ArchMutex m_mutex{}; std::mutex m_mutex;
}; };