Commit 0696cac5 authored by Max Kellermann's avatar Max Kellermann

db/upnp/Discovery: eliminate full copy in getServer()

parent 0c2485e8
......@@ -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;
}
}
}
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment