Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
communication_ipc
提交
f26e5635
C
communication_ipc
项目概览
OpenHarmony
/
communication_ipc
大约 1 年 前同步成功
通知
20
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
communication_ipc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
f26e5635
编写于
7月 11, 2023
作者:
O
openharmony_ci
提交者:
Gitee
7月 11, 2023
浏览文件
操作
浏览文件
下载
差异文件
!736 回退NAPIRemoteObject内存泄漏相关修改
Merge pull request !736 from 马根堂/master
上级
daeac648
7e509381
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
28 addition
and
61 deletion
+28
-61
ipc/native/src/core/source/ipc_object_stub.cpp
ipc/native/src/core/source/ipc_object_stub.cpp
+1
-1
ipc/native/src/napi_common/include/napi_remote_object_holder.h
...ative/src/napi_common/include/napi_remote_object_holder.h
+3
-5
ipc/native/src/napi_common/include/napi_remote_object_internal.h
...ive/src/napi_common/include/napi_remote_object_internal.h
+1
-5
ipc/native/src/napi_common/source/napi_remote_object.cpp
ipc/native/src/napi_common/source/napi_remote_object.cpp
+9
-20
ipc/native/src/napi_common/source/napi_remote_object_holder.cpp
...tive/src/napi_common/source/napi_remote_object_holder.cpp
+14
-30
未找到文件。
ipc/native/src/core/source/ipc_object_stub.cpp
浏览文件 @
f26e5635
...
...
@@ -371,7 +371,7 @@ int IPCObjectStub::GetObjectType() const
int32_t
IPCObjectStub
::
ProcessProto
(
uint32_t
code
,
MessageParcel
&
data
,
MessageParcel
&
reply
,
MessageOption
&
option
)
{
int
result
=
ERR_NONE
;
ZLOGD
(
LABEL
,
"
normal stub object, descriptor_=%{public}s"
,
Str16ToStr8
(
descriptor_
).
c_str
()
);
ZLOGD
(
LABEL
,
"
IPCObjectStub::ProcessProto called, type = 0, normal stub object"
);
if
(
!
reply
.
WriteUint32
(
IRemoteObject
::
IF_PROT_BINDER
))
{
ZLOGE
(
LABEL
,
"write to parcel fail"
);
result
=
IPC_STUB_WRITE_PARCEL_ERR
;
...
...
ipc/native/src/napi_common/include/napi_remote_object_holder.h
浏览文件 @
f26e5635
...
...
@@ -26,9 +26,9 @@
namespace
OHOS
{
class
NAPIRemoteObjectHolder
:
public
RefBase
{
public:
explicit
NAPIRemoteObjectHolder
(
napi_env
env
,
const
std
::
u16string
&
descriptor
,
napi_value
thisVar
);
explicit
NAPIRemoteObjectHolder
(
napi_env
env
,
const
std
::
u16string
&
descriptor
);
~
NAPIRemoteObjectHolder
();
sptr
<
NAPIRemoteObject
>
Get
(
napi_
env
envNew
);
sptr
<
NAPIRemoteObject
>
Get
(
napi_
value
object
);
void
Set
(
sptr
<
NAPIRemoteObject
>
object
);
void
attachLocalInterface
(
napi_value
localInterface
,
std
::
string
&
descriptor
);
napi_value
queryLocalInterface
(
std
::
string
&
descriptor
);
...
...
@@ -64,11 +64,9 @@ private:
std
::
mutex
mutex_
;
napi_env
env_
=
nullptr
;
std
::
u16string
descriptor_
;
sptr
<
NAPIRemoteObject
>
sptrCachedObject_
;
wptr
<
NAPIRemoteObject
>
wptrCachedObject_
;
sptr
<
NAPIRemoteObject
>
cachedObject_
;
napi_ref
localInterfaceRef_
;
int32_t
attachCount_
;
napi_ref
jsObjectRef_
=
nullptr
;
};
}
// namespace OHOS
#endif // NAPI_REMOTE_OBJECT_HOLDER_H
\ No newline at end of file
ipc/native/src/napi_common/include/napi_remote_object_internal.h
浏览文件 @
f26e5635
...
...
@@ -26,7 +26,7 @@
namespace
OHOS
{
class
NAPIRemoteObject
:
public
IPCObjectStub
{
public:
NAPIRemoteObject
(
napi_env
env
New
,
napi_env
env
,
napi_ref
jsObjectRef
,
const
std
::
u16string
&
descriptor
);
NAPIRemoteObject
(
napi_env
env
,
napi_value
thisVar
,
const
std
::
u16string
&
descriptor
);
~
NAPIRemoteObject
()
override
;
...
...
@@ -37,12 +37,8 @@ public:
int
OnRemoteRequest
(
uint32_t
code
,
MessageParcel
&
data
,
MessageParcel
&
reply
,
MessageOption
&
option
)
override
;
napi_ref
GetJsObjectRef
()
const
;
void
SetNewEnv
(
napi_env
envNew
);
private:
std
::
u16string
desc_
;
napi_env
env_
=
nullptr
;
napi_env
envNew_
=
nullptr
;
napi_value
thisVar_
=
nullptr
;
static
napi_value
ThenCallback
(
napi_env
env
,
napi_callback_info
info
);
static
napi_value
CatchCallback
(
napi_env
env
,
napi_callback_info
info
);
...
...
ipc/native/src/napi_common/source/napi_remote_object.cpp
浏览文件 @
f26e5635
...
...
@@ -60,7 +60,6 @@ static void RemoteObjectHolderFinalizeCb(napi_env env, void *data, void *hint)
}
holder
->
Lock
();
int32_t
curAttachCount
=
holder
->
DecAttachCount
();
ZLOGI
(
LOG_LABEL
,
"NAPIRemoteObjectHolder destructed by js callback, curAttachCount:%{public}d"
,
curAttachCount
);
if
(
curAttachCount
==
0
)
{
delete
holder
;
}
...
...
@@ -135,7 +134,7 @@ napi_value RemoteObject_JS_Constructor(napi_env env, napi_callback_info info)
napi_get_value_string_utf8
(
env
,
argv
[
0
],
stringValue
,
bufferSize
+
1
,
&
jsStringLength
);
NAPI_ASSERT
(
env
,
jsStringLength
==
bufferSize
,
"string length wrong"
);
std
::
string
descriptor
=
stringValue
;
auto
holder
=
new
NAPIRemoteObjectHolder
(
env
,
Str8ToStr16
(
descriptor
)
,
thisVar
);
auto
holder
=
new
NAPIRemoteObjectHolder
(
env
,
Str8ToStr16
(
descriptor
));
auto
nativeObj
=
ConvertNativeValueTo
<
NativeObject
>
(
reinterpret_cast
<
NativeValue
*>
(
thisVar
));
if
(
nativeObj
==
nullptr
)
{
ZLOGE
(
LOG_LABEL
,
"Failed to get RemoteObject native object"
);
...
...
@@ -146,19 +145,17 @@ napi_value RemoteObject_JS_Constructor(napi_env env, napi_callback_info info)
// connect native object to js thisVar
napi_status
status
=
napi_wrap
(
env
,
thisVar
,
holder
,
RemoteObjectHolderFinalizeCb
,
nullptr
,
nullptr
);
NAPI_ASSERT
(
env
,
status
==
napi_ok
,
"wrap js RemoteObject and native holder failed"
);
if
(
NAPI_ohos_rpc_getNativeRemoteObject
(
env
,
thisVar
)
==
nullptr
)
{
ZLOGE
(
LOG_LABEL
,
"RemoteObject_JS_Constructor create native object failed"
);
return
nullptr
;
}
return
thisVar
;
}
NAPIRemoteObject
::
NAPIRemoteObject
(
napi_env
envNew
,
napi_env
env
,
napi_ref
jsObjectRef
,
const
std
::
u16string
&
descriptor
)
NAPIRemoteObject
::
NAPIRemoteObject
(
napi_env
env
,
napi_value
thisVar
,
const
std
::
u16string
&
descriptor
)
:
IPCObjectStub
(
descriptor
)
{
envNew_
=
envNew
;
env_
=
env
;
desc_
=
descriptor
;
napi_value
thisVar
=
nullptr
;
napi_get_reference_value
(
env
,
jsObjectRef
,
&
thisVar
);
NAPI_ASSERT_RETURN_VOID
(
env
,
thisVar
!=
nullptr
,
"failed to get value from js RemoteObject ref"
);
thisVar_
=
thisVar
;
napi_create_reference
(
env
,
thisVar_
,
1
,
&
thisVarRef_
);
NAPI_ASSERT_RETURN_VOID
(
env
,
thisVarRef_
!=
nullptr
,
"failed to create ref to js RemoteObject"
);
...
...
@@ -166,8 +163,8 @@ NAPIRemoteObject::NAPIRemoteObject(napi_env envNew, napi_env env, napi_ref jsObj
NAPIRemoteObject
::~
NAPIRemoteObject
()
{
ZLOGI
(
LOG_LABEL
,
"NAPIRemoteObject
destroyed, desc:%{public}s"
,
Str16ToStr8
(
desc_
).
c_str
()
);
if
(
thisVarRef_
!=
nullptr
&&
envNew_
==
env_
)
{
ZLOGI
(
LOG_LABEL
,
"NAPIRemoteObject
Destructor"
);
if
(
thisVarRef_
!=
nullptr
)
{
napi_status
status
=
napi_delete_reference
(
env_
,
thisVarRef_
);
NAPI_ASSERT_RETURN_VOID
(
env_
,
status
==
napi_ok
,
"failed to delete ref to js RemoteObject"
);
thisVarRef_
=
nullptr
;
...
...
@@ -189,14 +186,6 @@ napi_ref NAPIRemoteObject::GetJsObjectRef() const
return
thisVarRef_
;
}
void
NAPIRemoteObject
::
SetNewEnv
(
napi_env
envNew
)
{
if
(
envNew_
!=
envNew
)
{
ZLOGI
(
LOG_LABEL
,
"env updated"
);
}
envNew_
=
envNew
;
}
void
NAPI_RemoteObject_getCallingInfo
(
CallingInfo
&
newCallingInfoParam
)
{
newCallingInfoParam
.
callingPid
=
IPCSkeleton
::
GetCallingPid
();
...
...
@@ -670,7 +659,7 @@ sptr<IRemoteObject> NAPI_ohos_rpc_getNativeRemoteObject(napi_env env, napi_value
NAPIRemoteObjectHolder
*
holder
=
nullptr
;
napi_unwrap
(
env
,
object
,
(
void
**
)
&
holder
);
NAPI_ASSERT
(
env
,
holder
!=
nullptr
,
"failed to get napi remote object holder"
);
return
holder
!=
nullptr
?
holder
->
Get
(
env
)
:
nullptr
;
return
holder
!=
nullptr
?
holder
->
Get
(
object
)
:
nullptr
;
}
napi_value
proxyConstructor
=
nullptr
;
...
...
ipc/native/src/napi_common/source/napi_remote_object_holder.cpp
浏览文件 @
f26e5635
...
...
@@ -18,56 +18,40 @@
#include <string_ex.h>
namespace
OHOS
{
NAPIRemoteObjectHolder
::
NAPIRemoteObjectHolder
(
napi_env
env
,
const
std
::
u16string
&
descriptor
,
napi_value
thisVar
)
{
env_
=
env
;
descriptor_
=
descriptor
;
sptrCachedObject_
=
nullptr
;
wptrCachedObject_
=
nullptr
;
localInterfaceRef_
=
nullptr
;
attachCount_
=
1
;
napi_create_reference
(
env
,
thisVar
,
0
,
&
jsObjectRef_
);
}
NAPIRemoteObjectHolder
::
NAPIRemoteObjectHolder
(
napi_env
env
,
const
std
::
u16string
&
descriptor
)
:
env_
(
env
),
descriptor_
(
descriptor
),
cachedObject_
(
nullptr
),
localInterfaceRef_
(
nullptr
),
attachCount_
(
1
)
{}
NAPIRemoteObjectHolder
::~
NAPIRemoteObjectHolder
()
{
// free the reference of object.
sptrCachedObject_
=
nullptr
;
wptrCachedObject_
=
nullptr
;
cachedObject_
=
nullptr
;
if
(
localInterfaceRef_
!=
nullptr
)
{
napi_delete_reference
(
env_
,
localInterfaceRef_
);
}
if
(
jsObjectRef_
!=
nullptr
)
{
napi_delete_reference
(
env_
,
jsObjectRef_
);
}
}
sptr
<
NAPIRemoteObject
>
NAPIRemoteObjectHolder
::
Get
(
napi_
env
envNew
)
sptr
<
NAPIRemoteObject
>
NAPIRemoteObjectHolder
::
Get
(
napi_
value
jsRemoteObject
)
{
std
::
lock_guard
<
std
::
mutex
>
lockGuard
(
mutex_
);
// grab an strong reference to the object,
// so it will not be freed util this reference released.
if
(
sptrCachedObject_
!=
nullptr
)
{
return
sptrCachedObject_
;
sptr
<
NAPIRemoteObject
>
remoteObject
=
nullptr
;
if
(
cachedObject_
!=
nullptr
)
{
remoteObject
=
cachedObject_
;
}
sptr
<
NAPIRemoteObject
>
tmp
=
wptrCachedObject_
.
promote
();
if
(
tmp
==
nullptr
)
{
tmp
=
new
NAPIRemoteObject
(
envNew
,
env_
,
jsObjectRef_
,
descriptor_
);
wptrCachedObject_
=
tmp
;
if
(
remoteObject
==
nullptr
)
{
remoteObject
=
new
NAPIRemoteObject
(
env_
,
jsRemoteObject
,
descriptor_
);
cachedObject_
=
remoteObject
;
}
tmp
->
SetNewEnv
(
envNew
);
return
tmp
;
return
remoteObject
;
}
void
NAPIRemoteObjectHolder
::
Set
(
sptr
<
NAPIRemoteObject
>
object
)
{
std
::
lock_guard
<
std
::
mutex
>
lockGuard
(
mutex_
);
IPCObjectStub
*
tmp
=
static_cast
<
IPCObjectStub
*>
(
object
.
GetRefPtr
());
if
(
tmp
->
GetObjectType
()
==
IPCObjectStub
::
OBJECT_TYPE_JAVASCRIPT
)
{
wptrCachedObject_
=
object
;
}
else
{
sptrCachedObject_
=
object
;
}
cachedObject_
=
object
;
}
void
NAPIRemoteObjectHolder
::
attachLocalInterface
(
napi_value
localInterface
,
std
::
string
&
descriptor
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录