lib/arch: Use standard mutex primitives in BSD network impl

This commit is contained in:
Povilas Kanapickas 2021-11-03 02:58:24 +02:00
parent 9e7982f8ec
commit 8586b0a581
2 changed files with 21 additions and 30 deletions

View File

@ -93,14 +93,11 @@ ArchNetworkBSD::ArchNetworkBSD()
ArchNetworkBSD::~ArchNetworkBSD() ArchNetworkBSD::~ArchNetworkBSD()
{ {
ARCH->closeMutex(m_mutex);
} }
void void
ArchNetworkBSD::init() ArchNetworkBSD::init()
{ {
// create mutex to make some calls thread safe
m_mutex = ARCH->newMutex();
} }
ArchSocket ArchSocket
@ -137,9 +134,8 @@ ArchNetworkBSD::copySocket(ArchSocket s)
assert(s != NULL); assert(s != NULL);
// ref the socket and return it // ref the socket and return it
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(mutex_);
++s->m_refCount; ++s->m_refCount;
ARCH->unlockMutex(m_mutex);
return s; return s;
} }
@ -149,18 +145,22 @@ ArchNetworkBSD::closeSocket(ArchSocket s)
assert(s != NULL); assert(s != NULL);
// unref the socket and note if it should be released // unref the socket and note if it should be released
ARCH->lockMutex(m_mutex); bool doClose = false;
const bool doClose = (--s->m_refCount == 0); {
ARCH->unlockMutex(m_mutex); std::lock_guard<std::mutex> lock(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);
{
std::lock_guard<std::mutex> lock(mutex_);
++s->m_refCount; ++s->m_refCount;
ARCH->unlockMutex(m_mutex); }
throwError(err); throwError(err);
} }
delete s; delete s;
@ -697,9 +697,8 @@ ArchNetworkBSD::nameToAddr(const std::string& name)
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; hints.ai_family = AF_UNSPEC;
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(mutex_);
if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) { if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) {
ARCH->unlockMutex(m_mutex);
delete addr; delete addr;
throwNameError(ret); throwNameError(ret);
} }
@ -712,7 +711,6 @@ ArchNetworkBSD::nameToAddr(const std::string& name)
memcpy(&addr->m_addr, p->ai_addr, addr->m_len); memcpy(&addr->m_addr, p->ai_addr, addr->m_len);
freeaddrinfo(p); freeaddrinfo(p);
ARCH->unlockMutex(m_mutex);
return addr; return addr;
} }
@ -731,23 +729,16 @@ ArchNetworkBSD::addrToName(ArchNetAddress addr)
assert(addr != NULL); assert(addr != NULL);
// mutexed name lookup (ugh) // mutexed name lookup (ugh)
ARCH->lockMutex(m_mutex); std::lock_guard<std::mutex> lock(mutex_);
char host[1024]; char host[1024];
char service[20]; char service[20];
int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host,
sizeof(host), service, sizeof(service), 0); sizeof(host), service, sizeof(service), 0);
if (ret != 0) { if (ret != 0) {
ARCH->unlockMutex(m_mutex);
throwNameError(ret); throwNameError(ret);
} }
// save (primary) name return host;
std::string name = host;
// done with static buffer
ARCH->unlockMutex(m_mutex);
return name;
} }
std::string std::string
@ -758,18 +749,17 @@ ArchNetworkBSD::addrToString(ArchNetAddress addr)
switch (getAddrFamily(addr)) { switch (getAddrFamily(addr)) {
case kINET: { case kINET: {
auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
ARCH->lockMutex(m_mutex);
std::string s = inet_ntoa(ipAddr->sin_addr); std::lock_guard<std::mutex> lock(mutex_);
ARCH->unlockMutex(m_mutex); return inet_ntoa(ipAddr->sin_addr);
return s;
} }
case kINET6: { case kINET6: {
char strAddr[INET6_ADDRSTRLEN]; char strAddr[INET6_ADDRSTRLEN];
auto* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); auto* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
ARCH->lockMutex(m_mutex);
std::lock_guard<std::mutex> lock(mutex_);
inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN);
ARCH->unlockMutex(m_mutex);
return strAddr; return strAddr;
} }

View File

@ -20,6 +20,7 @@
#include "arch/IArchNetwork.h" #include "arch/IArchNetwork.h"
#include "arch/IArchMultithread.h" #include "arch/IArchMultithread.h"
#include <mutex>
#if HAVE_SYS_TYPES_H #if HAVE_SYS_TYPES_H
# include <sys/types.h> # include <sys/types.h>
@ -101,5 +102,5 @@ private:
void throwNameError(int); void throwNameError(int);
private: private:
ArchMutex m_mutex; std::mutex mutex_;
}; };