From a1f37c6c3f7f5e2cb9e755eaad57b0afe12eb680 Mon Sep 17 00:00:00 2001 From: "raoxianhong@jingjiamicro.com" Date: Sat, 7 Aug 2021 07:42:14 +0800 Subject: [PATCH] =?UTF-8?q?202108070741=20=E4=BF=AE=E6=94=B9AddRef?= =?UTF-8?q?=E5=92=8CRelease=E7=9A=84=E5=AE=9E=E7=8E=B0=EF=BC=8C=E9=87=87?= =?UTF-8?q?=E7=94=A8=E5=8E=9F=E5=AD=90=E6=93=8D=E4=BD=9C=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E7=BA=BF=E7=A8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/object.h | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/include/object.h b/include/object.h index 8f4f9dc..6ad8cea 100644 --- a/include/object.h +++ b/include/object.h @@ -33,6 +33,7 @@ 202105140816:rxh 根据git的要求增加License 202107081052:rxh 修改object.h支持用c++实现LCOM对象 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 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) \ do \ { \ @@ -429,10 +446,10 @@ do \ static int _obj##AddRef(HOBJECT object) \ { \ _localstruct * pD; \ - if (!objectIsValid(object)) \ + if (!objectIsValid(object)) \ return EIID_INVALIDOBJECT; \ - pD = (_localstruct *)objectThis(object); \ - pD->__object_refcount++; \ + pD = (_localstruct *)objectThis(object); \ + INCREMENT(pD->__object_refcount); \ return pD->__object_refcount; \ } \ \ @@ -440,10 +457,10 @@ static int _obj##Release(HOBJECT object) \ { \ _localstruct * pD; \ int ret; \ - if (!objectIsValid(object)) \ + if (!objectIsValid(object)) \ return EIID_INVALIDOBJECT; \ - pD = (_localstruct *)objectThis(object); \ - pD->__object_refcount--; \ + pD = (_localstruct *)objectThis(object); \ + DECREMENT(pD->__object_refcount); \ ret = pD->__object_refcount; \ if (pD->__object_refcount <= 0) { \ pD->__object_refcount = 1; /* 为了保证在Destroy过程中不出现递归调用,这里将引用记数设置为1 */ \ -- GitLab