diff options
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/upnp/Discovery.cxx | 27 | ||||
-rw-r--r-- | src/db/upnp/Discovery.hxx | 3 |
2 files changed, 21 insertions, 9 deletions
diff --git a/src/db/upnp/Discovery.cxx b/src/db/upnp/Discovery.cxx index 5eaf054f5..4aeb381fd 100644 --- a/src/db/upnp/Discovery.cxx +++ b/src/db/upnp/Discovery.cxx @@ -54,6 +54,22 @@ isMSDevice(const char *st) } inline void +UPnPDeviceDirectory::LockAdd(std::string &&id, ContentDirectoryDescriptor &&d) +{ + const ScopeLock protect(mutex); + directories[std::move(id)] = std::move(d); +} + +inline void +UPnPDeviceDirectory::LockRemove(const std::string &id) +{ + const ScopeLock protect(mutex); + auto i = directories.find(id); + if (i != directories.end()) + directories.erase(i); +} + +inline void UPnPDeviceDirectory::discoExplorer() { for (;;) { @@ -88,10 +104,7 @@ UPnPDeviceDirectory::discoExplorer() } } - mutex.lock(); - directories[std::move(tsk->deviceId)] = std::move(d); - mutex.unlock(); - + LockAdd(std::move(tsk->deviceId), std::move(d)); delete tsk; } } @@ -120,14 +133,10 @@ UPnPDeviceDirectory::OnAlive(Upnp_Discovery *disco) inline int UPnPDeviceDirectory::OnByeBye(Upnp_Discovery *disco) { - if (isMSDevice(disco->DeviceType) || isCDService(disco->ServiceType)) { // Device signals it is going off. - const ScopeLock protect(mutex); - auto it = directories.find(disco->DeviceId); - if (it != directories.end()) - directories.erase(it); + LockRemove(disco->DeviceId); } return UPNP_E_SUCCESS; diff --git a/src/db/upnp/Discovery.hxx b/src/db/upnp/Discovery.hxx index 78d905369..fec9fe1fb 100644 --- a/src/db/upnp/Discovery.hxx +++ b/src/db/upnp/Discovery.hxx @@ -129,6 +129,9 @@ private: */ bool expireDevices(Error &error); + void LockAdd(std::string &&id, ContentDirectoryDescriptor &&d); + void LockRemove(const std::string &id); + /** * Worker routine for the discovery queue. Get messages about * devices appearing and disappearing, and update the |