Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
饶先宏
Lcom
提交
a1f37c6c
L
Lcom
项目概览
饶先宏
/
Lcom
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
Lcom
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a1f37c6c
编写于
8月 07, 2021
作者:
饶先宏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
202108070741 修改AddRef和Release的实现,采用原子操作,支持多线程。
上级
1bf0a355
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
23 addition
and
6 deletion
+23
-6
include/object.h
include/object.h
+23
-6
未找到文件。
include/object.h
浏览文件 @
a1f37c6c
...
@@ -33,6 +33,7 @@
...
@@ -33,6 +33,7 @@
202105140816:rxh 根据git的要求增加License
202105140816:rxh 根据git的要求增加License
202107081052:rxh 修改object.h支持用c++实现LCOM对象
202107081052:rxh 修改object.h支持用c++实现LCOM对象
202107101536: rxh 修改INTERFACE_HEADER中__thisoffset的描述,避免出现从指针到int的截断警告
202107101536: rxh 修改INTERFACE_HEADER中__thisoffset的描述,避免出现从指针到int的截断警告
202108070740: rxh 修改AddRef和Release的实现,采用原子操作,支持多线程。
*/
*/
...
@@ -416,6 +417,22 @@ static int _obj##QueryInterface(HOBJECT object, IIDTYPE iid, const void **pInter
...
@@ -416,6 +417,22 @@ static int _obj##QueryInterface(HOBJECT object, IIDTYPE iid, const void **pInter
return EIID_UNSUPPORTEDINTERFACE; \
return EIID_UNSUPPORTEDINTERFACE; \
}
}
#ifdef WIN32
#include "windows.h"
#define INCREMENT(p) InterlockedIncrement(&p)
#define DECREMENT(p) InterlockedDecrement(&p)
#endif
#ifdef __GNUC__
#define INCREMENT(p) __sync_fetch_and_add(&p, 1);
#define DECREMENT(p) __sync_fetch_and_sub(&p, 1);
#endif
#ifndef INCREMENT
#define INCREMENT(p) p++
#define DECREMENT(p) p--
#endif
#define OBJECT_RETURN_GEN(_obj, _objptr, _retvar, _sid) \
#define OBJECT_RETURN_GEN(_obj, _objptr, _retvar, _sid) \
do \
do \
{ \
{ \
...
@@ -432,7 +449,7 @@ static int _obj##AddRef(HOBJECT object) \
...
@@ -432,7 +449,7 @@ static int _obj##AddRef(HOBJECT object) \
if (!objectIsValid(object)) \
if (!objectIsValid(object)) \
return EIID_INVALIDOBJECT; \
return EIID_INVALIDOBJECT; \
pD = (_localstruct *)objectThis(object); \
pD = (_localstruct *)objectThis(object); \
pD->__object_refcount++
; \
INCREMENT(pD->__object_refcount)
; \
return pD->__object_refcount; \
return pD->__object_refcount; \
} \
} \
\
\
...
@@ -443,7 +460,7 @@ static int _obj##Release(HOBJECT object) \
...
@@ -443,7 +460,7 @@ static int _obj##Release(HOBJECT object) \
if (!objectIsValid(object)) \
if (!objectIsValid(object)) \
return EIID_INVALIDOBJECT; \
return EIID_INVALIDOBJECT; \
pD = (_localstruct *)objectThis(object); \
pD = (_localstruct *)objectThis(object); \
pD->__object_refcount--
; \
DECREMENT(pD->__object_refcount)
; \
ret = pD->__object_refcount; \
ret = pD->__object_refcount; \
if (pD->__object_refcount <= 0) { \
if (pD->__object_refcount <= 0) { \
pD->__object_refcount = 1;
/* 为了保证在Destroy过程中不出现递归调用,这里将引用记数设置为1 */
\
pD->__object_refcount = 1;
/* 为了保证在Destroy过程中不出现递归调用,这里将引用记数设置为1 */
\
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录