2 * Copyright (C) 2013-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.
9 #include "LanguageInvokerThread.h"
11 #include "ScriptInvocationManager.h"
15 CLanguageInvokerThread::CLanguageInvokerThread(LanguageInvokerPtr invoker
,
16 CScriptInvocationManager
* invocationManager
,
18 : ILanguageInvoker(NULL
),
19 CThread("LanguageInvoker"),
20 m_invoker(std::move(invoker
)),
21 m_invocationManager(invocationManager
),
25 CLanguageInvokerThread::~CLanguageInvokerThread()
30 InvokerState
CLanguageInvokerThread::GetState() const
32 if (m_invoker
== NULL
)
33 return InvokerStateFailed
;
35 return m_invoker
->GetState();
38 void CLanguageInvokerThread::Release()
41 m_condition
.notify_one();
44 bool CLanguageInvokerThread::execute(const std::string
&script
, const std::vector
<std::string
> &arguments
)
46 if (m_invoker
== NULL
|| script
.empty())
52 if (CThread::IsRunning())
54 std::unique_lock
<std::mutex
> lck(m_mutex
);
56 m_condition
.notify_one();
61 //Todo wait until running
66 bool CLanguageInvokerThread::stop(bool wait
)
68 if (m_invoker
== NULL
)
71 if (!CThread::IsRunning())
77 if (m_invoker
->GetState() < InvokerStateExecutionDone
)
79 // stop the language-specific invoker
80 result
= m_invoker
->Stop(wait
);
83 CThread::StopThread(wait
);
88 void CLanguageInvokerThread::OnStartup()
90 if (m_invoker
== NULL
)
93 m_invoker
->SetId(GetId());
95 m_invoker
->SetAddon(m_addon
);
98 void CLanguageInvokerThread::Process()
100 if (m_invoker
== NULL
)
103 std::unique_lock
<std::mutex
> lckdl(m_mutex
);
107 m_invoker
->Execute(m_script
, m_args
);
109 if (m_invoker
->GetState() != InvokerStateScriptDone
)
112 m_condition
.wait(lckdl
, [this] { return m_bStop
|| m_restart
|| !m_reusable
; });
114 } while (m_reusable
&& !m_bStop
);
117 void CLanguageInvokerThread::OnExit()
119 if (m_invoker
== NULL
)
122 m_invoker
->onExecutionDone();
123 m_invocationManager
->OnExecutionDone(GetId());
126 void CLanguageInvokerThread::OnException()
128 if (m_invoker
== NULL
)
131 m_invoker
->onExecutionFailed();
132 m_invocationManager
->OnExecutionDone(GetId());