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.
11 #include "interfaces/generic/ScriptInvocationManager.h"
12 #include "interfaces/generic/ScriptRunner.h"
13 #include "threads/CriticalSection.h"
14 #include "threads/Event.h"
20 template<class TScript
>
21 class CRunningScriptsHandler
: protected CScriptRunner
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
,
39 if (script
== nullptr || addon
== nullptr || path
.empty())
42 // reuse an existing script handle or get a new one if necessary
43 int handle
= CScriptInvocationManager::GetInstance().GetReusablePluginHandle(addon
->LibPath());
45 handle
= GetNewScriptHandle(script
);
47 ReuseScriptHandle(handle
, script
);
50 auto result
= CScriptRunner::RunScript(addon
, path
, handle
, resume
);
52 // remove the script handle if necessary
53 RemoveScriptHandle(handle
);
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
;
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())
86 return scriptHandle
->second
;
89 static inline CCriticalSection
& GetScriptsLock() { return s_critical
; }
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;