aboutsummaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-01-18 12:56:35 +0100
committerMax Kellermann <max@duempel.org>2014-01-18 12:56:35 +0100
commitb9f02f22c43ae8f86c8b1568cdccffd8793d087f (patch)
treeada701534a8c025c13b1444b2d183244381c6cc5 /src/db
parentb6356104099c22f63da933d076e1be1191c5be38 (diff)
downloadmpd-b9f02f22c43ae8f86c8b1568cdccffd8793d087f.tar.gz
mpd-b9f02f22c43ae8f86c8b1568cdccffd8793d087f.tar.xz
mpd-b9f02f22c43ae8f86c8b1568cdccffd8793d087f.zip
db/upnp: don't use WorkQueue for _ADVERTISEMENT_BYEBYE
Remove the ContentDirectoryDescriptor right away. Reduces bloat.
Diffstat (limited to 'src/db')
-rw-r--r--src/db/upnp/Discovery.cxx61
-rw-r--r--src/db/upnp/Discovery.hxx5
2 files changed, 30 insertions, 36 deletions
diff --git a/src/db/upnp/Discovery.cxx b/src/db/upnp/Discovery.cxx
index d7982f670..ad63530db 100644
--- a/src/db/upnp/Discovery.cxx
+++ b/src/db/upnp/Discovery.cxx
@@ -62,40 +62,33 @@ UPnPDeviceDirectory::discoExplorer()
}
const ScopeLock protect(mutex);
- if (!tsk->alive) {
- // Device signals it is going off.
- auto it = directories.find(tsk->deviceId);
- if (it != directories.end()) {
- directories.erase(it);
- }
- } else {
- // Device signals its existence and well-being. Perform the
- // UPnP "description" phase by downloading and decoding the
- // description document.
- char *buf;
- // LINE_SIZE is defined by libupnp's upnp.h...
- char contentType[LINE_SIZE];
- int code = UpnpDownloadUrlItem(tsk->url.c_str(), &buf, contentType);
- if (code != UPNP_E_SUCCESS) {
- continue;
- }
- std::string sdesc(buf);
+ // Device signals its existence and well-being. Perform the
+ // UPnP "description" phase by downloading and decoding the
+ // description document.
+ char *buf;
+ // LINE_SIZE is defined by libupnp's upnp.h...
+ char contentType[LINE_SIZE];
+ int code = UpnpDownloadUrlItem(tsk->url.c_str(), &buf, contentType);
+ if (code != UPNP_E_SUCCESS) {
+ continue;
+ }
+ std::string sdesc(buf);
- // Update or insert the device
- ContentDirectoryDescriptor d(tsk->url, sdesc,
- time(0), tsk->expires);
- if (!d.device.ok) {
- continue;
- }
+ // Update or insert the device
+ ContentDirectoryDescriptor d(tsk->url, sdesc,
+ time(0), tsk->expires);
+ if (!d.device.ok) {
+ continue;
+ }
#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
- auto e = directories.emplace(tsk->deviceId, d);
+ auto e = directories.emplace(tsk->deviceId, d);
#else
- auto e = directories.insert(std::make_pair(tsk->deviceId, d));
+ auto e = directories.insert(std::make_pair(tsk->deviceId, d));
#endif
- if (!e.second)
- e.first->second = d;
- }
+ if (!e.second)
+ e.first->second = d;
+
delete tsk;
}
}
@@ -113,7 +106,7 @@ UPnPDeviceDirectory::OnAlive(Upnp_Discovery *disco)
{
if (isMSDevice(disco->DeviceType) ||
isCDService(disco->ServiceType)) {
- DiscoveredTask *tp = new DiscoveredTask(1, disco);
+ DiscoveredTask *tp = new DiscoveredTask(disco);
if (discoveredQueue.put(tp))
return UPNP_E_FINISH;
}
@@ -127,9 +120,11 @@ UPnPDeviceDirectory::OnByeBye(Upnp_Discovery *disco)
if (isMSDevice(disco->DeviceType) ||
isCDService(disco->ServiceType)) {
- DiscoveredTask *tp = new DiscoveredTask(0, disco);
- if (discoveredQueue.put(tp))
- return UPNP_E_FINISH;
+ // Device signals it is going off.
+ const ScopeLock protect(mutex);
+ auto it = directories.find(disco->DeviceId);
+ if (it != directories.end())
+ directories.erase(it);
}
return UPNP_E_SUCCESS;
diff --git a/src/db/upnp/Discovery.hxx b/src/db/upnp/Discovery.hxx
index c4704dc7e..9e362c96f 100644
--- a/src/db/upnp/Discovery.hxx
+++ b/src/db/upnp/Discovery.hxx
@@ -49,13 +49,12 @@ class UPnPDeviceDirectory {
* discovery thread.
*/
struct DiscoveredTask {
- bool alive;
std::string url;
std::string deviceId;
int expires; // Seconds valid
- DiscoveredTask(bool _alive, const Upnp_Discovery *disco)
- : alive(_alive), url(disco->Location),
+ DiscoveredTask(const Upnp_Discovery *disco)
+ :url(disco->Location),
deviceId(disco->DeviceId),
expires(disco->Expires) {}
};