[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / interfaces / generic / RunningScriptsHandler.h
blob59f18bb39db1608f4f4c05cec3242d927546caf6
1 /*
2 * Copyright (C) 2017-2021 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 #pragma once
11 #include "interfaces/generic/ScriptInvocationManager.h"
12 #include "interfaces/generic/ScriptRunner.h"
13 #include "threads/CriticalSection.h"
14 #include "threads/Event.h"
16 #include <cstdint>
17 #include <map>
18 #include <mutex>
20 template<class TScript>
21 class CRunningScriptsHandler : protected CScriptRunner
23 protected:
24 using HandleType = int;
26 CRunningScriptsHandler() = default;
27 virtual ~CRunningScriptsHandler() = default;
29 using CScriptRunner::ExecuteScript;
30 using CScriptRunner::GetAddon;
31 using CScriptRunner::SetDone;
32 using CScriptRunner::StartScript;
34 bool RunScript(TScript* script,
35 const ADDON::AddonPtr& addon,
36 const std::string& path,
37 bool resume)
39 if (script == nullptr || addon == nullptr || path.empty())
40 return false;
42 // reuse an existing script handle or get a new one if necessary
43 int handle = CScriptInvocationManager::GetInstance().GetReusablePluginHandle(addon->LibPath());
44 if (handle < 0)
45 handle = GetNewScriptHandle(script);
46 else
47 ReuseScriptHandle(handle, script);
49 // run the script
50 auto result = CScriptRunner::RunScript(addon, path, handle, resume);
52 // remove the script handle if necessary
53 RemoveScriptHandle(handle);
55 return result;
58 static HandleType GetNewScriptHandle(TScript* script)
60 std::unique_lock<CCriticalSection> lock(s_critical);
61 uint32_t handle = ++s_scriptHandleCounter;
62 s_scriptHandles[handle] = script;
64 return handle;
67 static void ReuseScriptHandle(HandleType handle, TScript* script)
69 std::unique_lock<CCriticalSection> lock(s_critical);
70 s_scriptHandles[handle] = script;
73 static void RemoveScriptHandle(HandleType handle)
75 std::unique_lock<CCriticalSection> lock(s_critical);
76 s_scriptHandles.erase(handle);
79 static TScript* GetScriptFromHandle(HandleType handle)
81 std::unique_lock<CCriticalSection> lock(s_critical);
82 auto scriptHandle = s_scriptHandles.find(handle);
83 if (scriptHandle == s_scriptHandles.end())
84 return nullptr;
86 return scriptHandle->second;
89 static inline CCriticalSection& GetScriptsLock() { return s_critical; }
91 private:
92 static std::map<HandleType, TScript*> s_scriptHandles;
93 static CCriticalSection s_critical;
94 static HandleType s_scriptHandleCounter;
97 template<class TScript>
98 std::map<typename CRunningScriptsHandler<TScript>::HandleType, TScript*>
99 CRunningScriptsHandler<TScript>::s_scriptHandles;
100 template<class TScript>
101 CCriticalSection CRunningScriptsHandler<TScript>::s_critical;
102 template<class TScript>
103 typename CRunningScriptsHandler<TScript>::HandleType
104 CRunningScriptsHandler<TScript>::s_scriptHandleCounter = 0;