[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / addons / binary-addons / BinaryAddonManager.cpp
blob699fc09a1a40aa74a501ae98b3246835669cb008
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "BinaryAddonManager.h"
11 #include "addons/addoninfo/AddonInfo.h"
12 #include "addons/binary-addons/AddonDll.h"
13 #include "addons/binary-addons/BinaryAddonBase.h"
14 #include "utils/log.h"
16 #include <mutex>
18 using namespace ADDON;
20 BinaryAddonBasePtr CBinaryAddonManager::GetAddonBase(const AddonInfoPtr& addonInfo,
21 IAddonInstanceHandler* handler,
22 AddonDllPtr& addon)
24 std::unique_lock<CCriticalSection> lock(m_critSection);
26 BinaryAddonBasePtr addonBase;
28 const auto& addonInstances = m_runningAddons.find(addonInfo->ID());
29 if (addonInstances != m_runningAddons.end())
31 addonBase = addonInstances->second;
33 else
35 addonBase = std::make_shared<CBinaryAddonBase>(addonInfo);
37 m_runningAddons.emplace(addonInfo->ID(), addonBase);
40 if (addonBase)
42 addon = addonBase->GetAddon(handler);
44 if (!addon)
46 CLog::Log(LOGFATAL, "CBinaryAddonManager::{}: Tried to get add-on '{}' who not available!",
47 __func__, addonInfo->ID());
50 return addonBase;
53 void CBinaryAddonManager::ReleaseAddonBase(const BinaryAddonBasePtr& addonBase,
54 IAddonInstanceHandler* handler)
56 const auto& addon = m_runningAddons.find(addonBase->ID());
57 if (addon == m_runningAddons.end())
58 return;
60 addonBase->ReleaseAddon(handler);
62 if (addonBase->UsedInstanceCount() > 0)
63 return;
65 m_runningAddons.erase(addon);
68 BinaryAddonBasePtr CBinaryAddonManager::GetRunningAddonBase(const std::string& addonId) const
70 std::unique_lock<CCriticalSection> lock(m_critSection);
72 const auto& addonInstances = m_runningAddons.find(addonId);
73 if (addonInstances != m_runningAddons.end())
74 return addonInstances->second;
76 return nullptr;
79 AddonPtr CBinaryAddonManager::GetRunningAddon(const std::string& addonId) const
81 std::unique_lock<CCriticalSection> lock(m_critSection);
83 const BinaryAddonBasePtr base = GetRunningAddonBase(addonId);
84 if (base)
85 return base->GetActiveAddon();
87 return nullptr;