diff options
author | Max Kellermann <max@duempel.org> | 2014-01-18 16:18:51 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-18 16:18:51 +0100 |
commit | 0696cac50bfc9430e5094112dc5019be70998012 (patch) | |
tree | 28e14651b80108bb895faa9e5cf3d4f0e703a0ce | |
parent | 0c2485e86c280c69752a8fa6101e8d77ee4b9b25 (diff) | |
download | mpd-0696cac50bfc9430e5094112dc5019be70998012.tar.gz mpd-0696cac50bfc9430e5094112dc5019be70998012.tar.xz mpd-0696cac50bfc9430e5094112dc5019be70998012.zip |
db/upnp/Discovery: eliminate full copy in getServer()
-rw-r--r-- | src/db/upnp/Discovery.cxx | 22 | ||||
-rw-r--r-- | src/db/upnp/Discovery.hxx | 4 |
2 files changed, 17 insertions, 9 deletions
diff --git a/src/db/upnp/Discovery.cxx b/src/db/upnp/Discovery.cxx index f47741240..371f87244 100644 --- a/src/db/upnp/Discovery.cxx +++ b/src/db/upnp/Discovery.cxx @@ -262,14 +262,24 @@ UPnPDeviceDirectory::getServer(const char *friendlyName, ContentDirectoryService &server, Error &error) { - std::vector<ContentDirectoryService> ds; - if (!getDirServices(ds, error)) + // Has locking, do it before our own lock + if (!expireDevices(error)) return false; - for (const auto &i : ds) { - if (strcmp(friendlyName, i.getFriendlyName()) == 0) { - server = i; - return true; + const ScopeLock protect(mutex); + + for (const auto &i : directories) { + const auto &device = i.second.device; + + if (device.friendlyName != friendlyName) + continue; + + for (const auto &service : device.services) { + if (isCDService(service.serviceType.c_str())) { + server = ContentDirectoryService(device, + service); + return true; + } } } diff --git a/src/db/upnp/Discovery.hxx b/src/db/upnp/Discovery.hxx index 59eed9331..d1df9f666 100644 --- a/src/db/upnp/Discovery.hxx +++ b/src/db/upnp/Discovery.hxx @@ -107,9 +107,7 @@ public: bool getDirServices(std::vector<ContentDirectoryService> &, Error &); /** - * Get server by friendly name. It's a bit wasteful to copy - * all servers for this, we could directly walk the list. Otoh - * there isn't going to be millions... + * Get server by friendly name. */ bool getServer(const char *friendlyName, ContentDirectoryService &server, |