From 0696cac50bfc9430e5094112dc5019be70998012 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 18 Jan 2014 16:18:51 +0100 Subject: [PATCH] db/upnp/Discovery: eliminate full copy in getServer() --- src/db/upnp/Discovery.cxx | 22 ++++++++++++++++------ 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 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 &, 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,