RDKTV-28536: Use JSOn Direct calls instead of Worker threads
Reason for change: Use as a temporary fix to address Thunder hang
Test Procedure: Monitor for Thunder hangs.
Risks: Low
Priority: P0
Change-Id: I3e9ff94e70fdfbbfdee37a982fc8616d3cb1661a
Signed-off-by: binuinbaraj <Binu_Inbaraj@cable.comcast.com>
(cherry picked from commit ca76c4580aa7f414c1ab29154c0d7e1844a47ae7)
diff --git a/recipes-extended/rdkservices/files/0003-UseJsonDirect.patch b/recipes-extended/rdkservices/files/0003-UseJsonDirect.patch
new file mode 100644
index 0000000..d067038
--- /dev/null
+++ b/recipes-extended/rdkservices/files/0003-UseJsonDirect.patch
@@ -0,0 +1,272 @@
+From 663fdb41cb3c44053fa71dfeeb960d93255c0947 Mon Sep 17 00:00:00 2001
+From: binbar366 <Binu_Inbaraj@comcast.com>
+Date: Thu, 14 Mar 2024 19:58:37 +0000
+Subject: [PATCH] Performance Metrics Compilation fix
+
+Signed-off-: Binu Inbaraj Binu_Inbaraj@comcast.com>
+---
+
+diff --git a/RDKShell/RDKShell.cpp b/RDKShell/RDKShell.cpp
+index 81f90535..d5fbf61d 100755
+--- a/RDKShell/RDKShell.cpp
++++ b/RDKShell/RDKShell.cpp
+@@ -417,29 +417,6 @@ namespace WPEFramework {
+ private:
+ std::function<void()> _work;
+ };
+- uint32_t cloneService(PluginHost::IShell* shell, const string& basecallsign, const string& newcallsign)
+- {
+- uint32_t result = Core::ERROR_ASYNC_FAILED;
+- Core::Event event(false, true);
+-#ifndef USE_THUNDER_R4
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatchType<void>>(Core::ProxyType<Job>::Create([&]() {
+-#else
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatch>(Core::ProxyType<Job>::Create([&]() {
+-#endif /* USE_THUNDER_R4 */
+- auto interface = shell->QueryInterfaceByCallsign<PluginHost::IController>("");
+- if (interface == nullptr) {
+- result = Core::ERROR_UNAVAILABLE;
+- std::cout << "no IController" << std::endl;
+- } else {
+- result = interface->Clone(basecallsign, newcallsign);
+- std::cout << "IController clone status " << result << std::endl;
+- interface->Release();
+- }
+- event.SetEvent();
+- })));
+- event.Lock();
+- return result;
+- }
+ uint32_t getValue(PluginHost::IShell* shell, const string& ns, const string& key, string& value)
+ {
+ uint32_t result;
+@@ -516,52 +493,6 @@ namespace WPEFramework {
+ }
+ return result;
+ }
+- uint32_t activate(PluginHost::IShell* shell, const string& callsign)
+- {
+- uint32_t result = Core::ERROR_ASYNC_FAILED;
+- Core::Event event(false, true);
+-#ifndef USE_THUNDER_R4
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatchType<void>>(Core::ProxyType<Job>::Create([&]() {
+-#else
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatch>(Core::ProxyType<Job>::Create([&]() {
+-#endif /* USE_THUNDER_R4 */
+- auto interface = shell->QueryInterfaceByCallsign<PluginHost::IShell>(callsign);
+- if (interface == nullptr) {
+- result = Core::ERROR_UNAVAILABLE;
+- std::cout << "no IShell for " << callsign << std::endl;
+- } else {
+- result = interface->Activate(PluginHost::IShell::reason::REQUESTED);
+- std::cout << "IShell activate status " << result << " for " << callsign << std::endl;
+- interface->Release();
+- }
+- event.SetEvent();
+- })));
+- event.Lock();
+- return result;
+- }
+- uint32_t deactivate(PluginHost::IShell* shell, const string& callsign)
+- {
+- uint32_t result = Core::ERROR_ASYNC_FAILED;
+- Core::Event event(false, true);
+-#ifndef USE_THUNDER_R4
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatchType<void>>(Core::ProxyType<Job>::Create([&]() {
+-#else
+- Core::IWorkerPool::Instance().Submit(Core::ProxyType<Core::IDispatch>(Core::ProxyType<Job>::Create([&]() {
+-#endif /* USE_THUNDER_R4 */
+- auto interface = shell->QueryInterfaceByCallsign<PluginHost::IShell>(callsign);
+- if (interface == nullptr) {
+- result = Core::ERROR_UNAVAILABLE;
+- std::cout << "no IShell for " << callsign << std::endl;
+- } else {
+- result = interface->Deactivate(PluginHost::IShell::reason::REQUESTED);
+- std::cout << "IShell deactivate status " << result << " for " << callsign << std::endl;
+- interface->Release();
+- }
+- event.SetEvent();
+- })));
+- event.Lock();
+- return result;
+- }
+ }
+
+ struct JSONRPCDirectLink
+@@ -873,7 +804,12 @@ namespace WPEFramework {
+ }
+ else if (requestName.compare("deactivateresidentapp") == 0)
+ {
+- auto deactivateStatus = deactivate(mCurrentService, "ResidentApp");
++ auto thunderController = std::unique_ptr<JSONRPCDirectLink>(new JSONRPCDirectLink(mCurrentService));
++ JsonObject deactivateParams;
++ deactivateParams.Set("callsign", "ResidentApp");
++ JsonObject deactivateResult;
++ int32_t deactivateStatus = thunderController->Invoke(0, "deactivate", deactivateParams, deactivateResult);
++ // auto deactivateStatus = deactivate(mCurrentService, "ResidentApp");
+ std::cout << "deactivating resident app status " << deactivateStatus << std::endl;
+ }
+ else if (requestName.compare("susbscribeSystemEvent") == 0)
+@@ -2286,7 +2222,12 @@ namespace WPEFramework {
+ std::cout << "callsign will be " << callsign << std::endl;
+ if (callsign.compare("org.rdk.RDKShell.1") != 0)
+ {
+- activate(mShell.mCurrentService, callsign);
++ //get callsign
++ JsonObject activateParams;
++ activateParams.Set("callsign",callsign.c_str());
++ JsonObject activateResult;
++ thunderController->Invoke<JsonObject, JsonObject>(3500, "activate", activateParams, activateResult);
++ //activate(mShell.mCurrentService, callsign);
+ }
+ else
+ {
+@@ -3990,6 +3931,7 @@ namespace WPEFramework {
+ originalPluginFound = true;
+ }
+ }
++ auto thunderController = std::unique_ptr<JSONRPCDirectLink>(new JSONRPCDirectLink(mCurrentService));
+ if ((false == newPluginFound) && (false == originalPluginFound)) {
+ PluginHost::IShell::state state;
+ if (getServiceState(mCurrentService, callsign, state) == Core::ERROR_NONE) {
+@@ -4014,13 +3956,23 @@ namespace WPEFramework {
+ else if (!newPluginFound)
+ {
+ std::cout << "attempting to clone type: " << type << " into " << callsign << std::endl;
+- uint32_t status = cloneService(mCurrentService, type, callsign);
++ JsonObject joParams;
++ joParams.Set("callsign", type);
++ joParams.Set("newcallsign",callsign.c_str());
++ JsonObject joResult;
++ // setting wait Time to 2 seconds
++ uint32_t status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "clone", joParams, joResult, true);
++ //uint32_t status = cloneService(mCurrentService, type, callsign);
+
+ std::cout << "clone status: " << status << std::endl;
+ if (status > 0)
+ {
+ std::cout << "trying status one more time...\n";
+- status = cloneService(mCurrentService, type, callsign);
++ JsonObject joParams2;
++ joParams2.Set("callsign", type);
++ joParams2.Set("newcallsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "clone", joParams2, joResult, true);
++ //status = cloneService(mCurrentService, type, callsign);
+ std::cout << "clone status: " << status << std::endl;
+ }
+
+@@ -4059,6 +4011,7 @@ namespace WPEFramework {
+ string configString;
+
+ uint32_t status = 0;
++ Core::JSON::ArrayType<PluginHost::MetaData::Service> joResult;
+ status = getConfig(mCurrentService, callsign, configString);
+
+ std::cout << "config status: " << status << std::endl;
+@@ -4254,13 +4207,19 @@ namespace WPEFramework {
+ state == PluginHost::IShell::state::PRECONDITION)
+ {
+ launchType = RDKShellLaunchType::ACTIVATE;
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams;
++ activateParams.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams, joResult);
++ //status = activate(mCurrentService, callsign);
+
+ std::cout << "activate 1 status: " << status << std::endl;
+ if (status > 0)
+ {
+ std::cout << "trying status one more time...\n";
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams2;
++ activateParams2.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams2, joResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate 1 status: " << status << std::endl;
+ }
+ }
+@@ -4268,25 +4227,37 @@ namespace WPEFramework {
+ else
+ {
+ launchType = RDKShellLaunchType::ACTIVATE;
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams;
++ activateParams.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams, joResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate 2 status: " << status << std::endl;
+ if (status > 0)
+ {
+ std::cout << "trying status one more time...\n";
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams2;
++ activateParams2.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams2, joResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate 2 status: " << status << std::endl;
+ }
+ }
+ }
+ else
+ {
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams;
++ activateParams.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams, joResult);
++ //status = activate(mCurrentService, callsign);
+
+ std::cout << "activate 3 status: " << status << std::endl;
+ if (status > 0)
+ {
+ std::cout << "trying status one more time...\n";
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams2;
++ activateParams2.Set("callsign",callsign.c_str());
++ status = thunderController->Invoke(RDKSHELL_THUNDER_TIMEOUT, "activate", activateParams2, joResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate 3 status: " << status << std::endl;
+ }
+ }
+@@ -4645,8 +4616,13 @@ namespace WPEFramework {
+ returnResponse(false);
+ }
+ std::cout << "destroying " << callsign << std::endl;
++ JsonObject joParams;
++ joParams.Set("callsign",callsign.c_str());
++ JsonObject joResult;
++ auto thunderController = getThunderControllerClient();
+ gDestroyMutex.lock();
+- uint32_t status = deactivate(mCurrentService, callsign);
++ uint32_t status = thunderController->Invoke<JsonObject, JsonObject>(RDKSHELL_THUNDER_TIMEOUT, "deactivate", joParams, joResult);
++ //uint32_t status = deactivate(mCurrentService, callsign);
+ gDestroyMutex.unlock();
+ if (status > 0)
+ {
+@@ -5622,6 +5598,7 @@ namespace WPEFramework {
+ std::cout << "stopHdmiStatus status: " << stopHdmiStatus << std::endl;
+
+ sForceResidentAppLaunch = true;
++ auto thunderController = getThunderControllerClient();
+ string configString;
+
+ int32_t status = 0;
+@@ -5652,12 +5629,17 @@ namespace WPEFramework {
+
+ bool ret = true;
+ std::string callsign("ResidentApp");
+- status = activate(mCurrentService, callsign);
++ JsonObject activateParams;
++ activateParams.Set("callsign",callsign.c_str());
++ JsonObject activateResult;
++ status = thunderController->Invoke<JsonObject, JsonObject>(3500, "activate", activateParams, activateResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate resident app status: " << status << std::endl;
+ if (status > 0)
+ {
+ std::cout << "trying status one more time...\n";
+- status = activate(mCurrentService, callsign);
++ status = thunderController->Invoke<JsonObject, JsonObject>(3500, "activate", activateParams, activateResult);
++ //status = activate(mCurrentService, callsign);
+ std::cout << "activate resident app status: " << status << std::endl;
+ if (status > 0)
+ {
diff --git a/recipes-extended/rdkservices/rdkservices_git.bb b/recipes-extended/rdkservices/rdkservices_git.bb
index 6896a32..f8a6537 100644
--- a/recipes-extended/rdkservices/rdkservices_git.bb
+++ b/recipes-extended/rdkservices/rdkservices_git.bb
@@ -27,6 +27,7 @@
file://0001-RDK-41681-PR4013.patch \
file://0002-Adding-Support-For-R4.patch \
file://0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework-rdkservice.patch \
+ file://0003-UseJsonDirect.patch \
"
# Nov 28 2023