diff --git a/interfaces/innerkits/c/ipc/BUILD.gn b/interfaces/innerkits/c/ipc/BUILD.gn index 73b35620d2873d3fc1470e75946c48925638e0c1..24655a2c2bfeedc03bfe7e71dc127cd3f0dfa604 100644 --- a/interfaces/innerkits/c/ipc/BUILD.gn +++ b/interfaces/innerkits/c/ipc/BUILD.gn @@ -175,6 +175,7 @@ if (ohos_kernel_type == "liteos_m") { "//third_party/bounds_checking_function/:libsec_shared", ] configs -= [ "//build/lite/config:clang_opt" ] + defines = [ "IPC_RESET_SKELETON" ] } SYSTEM_LEVEL = "small" @@ -217,6 +218,7 @@ if (ohos_kernel_type == "liteos_m") { ] deps = [ "//foundation/communication/dsoftbus/sdk:softbus_client" ] defines = [ "RPC_SOFTBUS_TRANS" ] + defines += [ "IPC_RESET_SKELETON" ] if (enable_socket_trans) { sources -= [ "$IPC_CORE_ROOT/rpc/trans_adapter/src/rpc_softbus_trans.c" ] diff --git a/ipc/native/c/ipc/src/liteos_a/ipc_invoker.c b/ipc/native/c/ipc/src/liteos_a/ipc_invoker.c index 623ce014fe2f35e9ede4a2afebecbc82da99fa7c..47a570a9b89adb6ccda4bafe7a0c46a274c67e7d 100644 --- a/ipc/native/c/ipc/src/liteos_a/ipc_invoker.c +++ b/ipc/native/c/ipc/src/liteos_a/ipc_invoker.c @@ -339,6 +339,7 @@ static void GetDeathCallback(IpcMsg* msg, HdlerArg* arg) return; } arg->msg = msg; + arg->num = MAX_DEATH_CALLBACK_NUM; (void)pthread_mutex_unlock(&g_ipcCallback.mutex); } diff --git a/ipc/native/c/manager/include/ipc_process_skeleton.h b/ipc/native/c/manager/include/ipc_process_skeleton.h index 6b0a2c63f9add2d807812c9a678f287cff73ecc6..b1cdfd5b1f0c88b84ad882ebd007c7085a83e7fe 100644 --- a/ipc/native/c/manager/include/ipc_process_skeleton.h +++ b/ipc/native/c/manager/include/ipc_process_skeleton.h @@ -70,7 +70,6 @@ void SendObituary(DeathCallback *deathCallback); void DeleteDeathCallback(DeathCallback *deathCallback); void WaitForProxyInit(SvcIdentity *svc); int32_t DeleteHandle(int32_t handle); -void ResetIpc(void); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/ipc/native/c/manager/include/ipc_skeleton_pri.h b/ipc/native/c/manager/include/ipc_skeleton_pri.h new file mode 100755 index 0000000000000000000000000000000000000000..ebd37bc97560122c5c521408a04d429c7e787680 --- /dev/null +++ b/ipc/native/c/manager/include/ipc_skeleton_pri.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_IPC_RPC_SKELETON_PRI_H +#define OHOS_IPC_RPC_SKELETON_PRI_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void ResetIpc(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // OHOS_IPC_RPC_SKELETON_PRI_H diff --git a/ipc/native/c/manager/src/ipc_process_skeleton.c b/ipc/native/c/manager/src/ipc_process_skeleton.c index 9bce0cea16e18763adf4bdb8cf82b0a78e52267b..0b9b4afb8fb4bfc14ef90ec739e2bdc63f14d6ab 100644 --- a/ipc/native/c/manager/src/ipc_process_skeleton.c +++ b/ipc/native/c/manager/src/ipc_process_skeleton.c @@ -15,6 +15,7 @@ #include "ipc_process_skeleton.h" #include "ipc_skeleton.h" +#include "ipc_skeleton_pri.h" #include "ipc_thread_pool.h" #include "iremote_invoker.h" #include "rpc_errno.h" @@ -422,10 +423,31 @@ void DeleteDeathCallback(DeathCallback *deathCallback) free(deathCallback); } +static void DeleteAllNode(void) +{ + (void)pthread_mutex_lock(&g_ipcSkeleton->lock); + DeathCallback *node = NULL; + DeathCallback *next = NULL; + UTILS_DL_LIST_FOR_EACH_ENTRY_SAFE(node, next, &g_ipcSkeleton->objects, DeathCallback, list) + { + pthread_mutex_destroy(&node->lock); + UtilsListDelete(&node->list); + free(node); + } + pthread_mutex_unlock(&g_ipcSkeleton->lock); +} + void ResetIpc(void) { + RPC_LOG_INFO("ResetIpc called"); RemoteInvoker *invoker = GetRemoteInvoker(); if (invoker != NULL && invoker->InvokerResetIpc != NULL) { (invoker->InvokerResetIpc)(); } + DeleteAllNode(); +#ifdef IPC_RESET_SKELETON + DeleteIpcSkeleton(g_ipcSkeleton); + g_ipcSkeleton = NULL; + g_ipcSkeleton = IpcProcessSkeleton(); +#endif } \ No newline at end of file