diff --git a/frameworks/liteipc_linux/src/liteipc_adapter.c b/frameworks/liteipc_linux/src/liteipc_adapter.c index 0013ee7a0c98017e2197b68d0bfa2dbc9c81b0ce..a61c45e144369dc1b65d3621cef7cab1aa43f7b6 100644 --- a/frameworks/liteipc_linux/src/liteipc_adapter.c +++ b/frameworks/liteipc_linux/src/liteipc_adapter.c @@ -575,6 +575,9 @@ static int BinderParse(const IpcContext *context, void *bio, uintptr_t ptr, case BR_DEAD_REPLY: ret = LITEIPC_DEAD_OBJECT; break; + case BR_CLEAR_DEATH_NOTIFICATION_DONE: + ptr += sizeof(binder_uintptr_t); + break; default: ret = -1; } @@ -1091,6 +1094,19 @@ static void BinderLinkToDeath(const SvcIdentity *sid, Testament *node, const Ipc BinderWrite(context, &data, sizeof(data)); } +static void BinderUnlinkToDeath(const SvcIdentity *sid, Testament *node) +{ + struct { + uint32_t cmd; + struct binder_handle_cookie payload; + } __attribute__((packed)) data; + + data.cmd = BC_CLEAR_DEATH_NOTIFICATION; + data.payload.handle = sid->handle; + data.payload.cookie = node; + BinderWrite(sid->ipcContext, &data, sizeof(data)); +} + int32_t RegisterDeathCallback(const IpcContext* context, SvcIdentity sid, IpcMsgHandler func, void* arg, uint32_t* cbId) { int ret = LITEIPC_OK; @@ -1169,6 +1185,7 @@ int32_t UnregisterDeathCallback(SvcIdentity sid, uint32_t cbId) node->size--; if (node->size == 0) { UtilsListDelete(&node->list); + BinderUnlinkToDeath(&sid, node); free(node); } }