classfactories
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Tue Sep 28 06:40:33 CDT 2004
Huw Davies <huw at codeweavers.com>
Fix a reference leak on failure (spotted by Rob Shearman)
Move some code over to the Interlocked* functions.
--
Huw Davies
huw at codeweavers.com
Index: dlls/amstream/main.c
===================================================================
RCS file: /home/wine/wine/dlls/amstream/main.c,v
retrieving revision 1.4
diff -u -r1.4 main.c
--- dlls/amstream/main.c 6 Sep 2004 20:34:30 -0000 1.4
+++ dlls/amstream/main.c 28 Sep 2004 11:19:49 -0000
@@ -95,15 +95,17 @@
return E_NOINTERFACE;
}
-static ULONG WINAPI AMCF_AddRef(LPCLASSFACTORY iface) {
+static ULONG WINAPI AMCF_AddRef(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
-static ULONG WINAPI AMCF_Release(LPCLASSFACTORY iface) {
+static ULONG WINAPI AMCF_Release(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = --This->ref;
+ ULONG ref = InterlockedDecrement(&This->ref);
if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
@@ -113,28 +115,26 @@
static HRESULT WINAPI AMCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
- REFIID riid, LPVOID *ppobj) {
+ REFIID riid, LPVOID *ppobj)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
HRESULT hres;
LPUNKNOWN punk;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+
+ *ppobj = NULL;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
+ if (SUCCEEDED(hres)) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
}
- IUnknown_Release(punk);
return hres;
}
-static HRESULT WINAPI AMCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+static HRESULT WINAPI AMCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
Index: dlls/d3dxof/main.c
===================================================================
RCS file: /home/wine/wine/dlls/d3dxof/main.c,v
retrieving revision 1.5
diff -u -r1.5 main.c
--- dlls/d3dxof/main.c 6 Sep 2004 21:34:26 -0000 1.5
+++ dlls/d3dxof/main.c 28 Sep 2004 11:19:49 -0000
@@ -97,14 +97,14 @@
static ULONG WINAPI XFCF_AddRef(LPCLASSFACTORY iface)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI XFCF_Release(LPCLASSFACTORY iface)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = --This->ref;
+ ULONG ref = InterlockedDecrement(&This->ref);
if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
@@ -120,17 +120,12 @@
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+ *ppobj = NULL;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
+ if (SUCCEEDED(hres)) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
}
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- IUnknown_Release(punk);
return hres;
}
Index: dlls/ddraw/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/main.c,v
retrieving revision 1.45
diff -u -r1.45 main.c
--- dlls/ddraw/main.c 8 Sep 2004 01:50:37 -0000 1.45
+++ dlls/ddraw/main.c 28 Sep 2004 11:19:49 -0000
@@ -491,29 +491,32 @@
return E_NOINTERFACE;
}
-static ULONG WINAPI DDCF_AddRef(LPCLASSFACTORY iface) {
+static ULONG WINAPI DDCF_AddRef(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
TRACE("(%p)->() incrementing from %ld.\n", This, This->ref);
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
-static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface) {
+static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+ TRACE("(%p)->() decrementing from %ld.\n", This, ref+1);
- TRACE("(%p)->() decrementing from %ld.\n", This, This->ref);
-
- if (--This->ref == 0)
+ if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
- return This->ref;
+ return ref;
}
static HRESULT WINAPI DDCF_CreateInstance(
LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
-) {
+)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
@@ -521,7 +524,8 @@
return This->pfnCreateInstance(pOuter, riid, ppobj);
}
-static HRESULT WINAPI DDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+static HRESULT WINAPI DDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
Index: dlls/dpnet/dpnet_main.c
===================================================================
RCS file: /home/wine/wine/dlls/dpnet/dpnet_main.c,v
retrieving revision 1.5
diff -u -r1.5 dpnet_main.c
--- dlls/dpnet/dpnet_main.c 6 Sep 2004 20:34:30 -0000 1.5
+++ dlls/dpnet/dpnet_main.c 28 Sep 2004 11:19:49 -0000
@@ -80,13 +80,13 @@
static ULONG WINAPI DICF_AddRef(LPCLASSFACTORY iface) {
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI DICF_Release(LPCLASSFACTORY iface) {
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
/* static class, won't be freed */
- return --(This->ref);
+ return InterlockedDecrement(&This->ref);
}
static HRESULT WINAPI DICF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
Index: dlls/dxdiagn/dxdiag_main.c
===================================================================
RCS file: /home/wine/wine/dlls/dxdiagn/dxdiag_main.c,v
retrieving revision 1.6
diff -u -r1.6 dxdiag_main.c
--- dlls/dxdiagn/dxdiag_main.c 6 Sep 2004 21:34:25 -0000 1.6
+++ dlls/dxdiagn/dxdiag_main.c 28 Sep 2004 11:19:49 -0000
@@ -55,13 +55,13 @@
static ULONG WINAPI DXDiagCF_AddRef(LPCLASSFACTORY iface) {
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI DXDiagCF_Release(LPCLASSFACTORY iface) {
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
/* static class, won't be freed */
- return --(This->ref);
+ return InterlockedDecrement(&This->ref);
}
static HRESULT WINAPI DXDiagCF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
Index: dlls/itss/itss.c
===================================================================
RCS file: /home/wine/wine/dlls/itss/itss.c,v
retrieving revision 1.3
diff -u -r1.3 itss.c
--- dlls/itss/itss.c 6 Sep 2004 20:34:29 -0000 1.3
+++ dlls/itss/itss.c 28 Sep 2004 11:19:49 -0000
@@ -103,15 +103,17 @@
return E_NOINTERFACE;
}
-static ULONG WINAPI ITSSCF_AddRef(LPCLASSFACTORY iface) {
+static ULONG WINAPI ITSSCF_AddRef(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
-static ULONG WINAPI ITSSCF_Release(LPCLASSFACTORY iface) {
+static ULONG WINAPI ITSSCF_Release(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = --This->ref;
+ ULONG ref = InterlockedDecrement(&This->ref);
if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
@@ -121,28 +123,25 @@
static HRESULT WINAPI ITSSCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
- REFIID riid, LPVOID *ppobj) {
+ REFIID riid, LPVOID *ppobj)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
HRESULT hres;
LPUNKNOWN punk;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+ *ppobj = NULL;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
+ if (SUCCEEDED(hres)) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
}
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- IUnknown_Release(punk);
return hres;
}
-static HRESULT WINAPI ITSSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+static HRESULT WINAPI ITSSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
Index: dlls/mlang/mlang.c
===================================================================
RCS file: /home/wine/wine/dlls/mlang/mlang.c,v
retrieving revision 1.14
diff -u -r1.14 mlang.c
--- dlls/mlang/mlang.c 22 Sep 2004 19:13:50 -0000 1.14
+++ dlls/mlang/mlang.c 28 Sep 2004 11:19:49 -0000
@@ -681,12 +681,14 @@
return E_NOINTERFACE;
}
-static ULONG WINAPI MLANGCF_AddRef(LPCLASSFACTORY iface) {
+static ULONG WINAPI MLANGCF_AddRef(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
return InterlockedIncrement(&This->ref);
}
-static ULONG WINAPI MLANGCF_Release(LPCLASSFACTORY iface) {
+static ULONG WINAPI MLANGCF_Release(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
@@ -701,29 +703,26 @@
}
static HRESULT WINAPI MLANGCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
- REFIID riid, LPVOID *ppobj) {
+ REFIID riid, LPVOID *ppobj)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
HRESULT hres;
LPUNKNOWN punk;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+ *ppobj = NULL;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
+ if (SUCCEEDED(hres)) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
}
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- IUnknown_Release(punk);
TRACE("returning (%p) -> %lx\n", *ppobj, hres);
return hres;
}
-static HRESULT WINAPI MLANGCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+static HRESULT WINAPI MLANGCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
Index: dlls/quartz/main.c
===================================================================
RCS file: /home/wine/wine/dlls/quartz/main.c,v
retrieving revision 1.39
diff -u -r1.39 main.c
--- dlls/quartz/main.c 22 Sep 2004 02:46:39 -0000 1.39
+++ dlls/quartz/main.c 28 Sep 2004 11:19:49 -0000
@@ -89,15 +89,17 @@
return E_NOINTERFACE;
}
-static ULONG WINAPI DSCF_AddRef(LPCLASSFACTORY iface) {
+static ULONG WINAPI DSCF_AddRef(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- return ++(This->ref);
+ return InterlockedIncrement(&This->ref);
}
-static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface) {
+static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = --This->ref;
+ ULONG ref = InterlockedDecrement(&This->ref);
if (ref == 0)
HeapFree(GetProcessHeap(), 0, This);
@@ -107,28 +109,25 @@
static HRESULT WINAPI DSCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
- REFIID riid, LPVOID *ppobj) {
+ REFIID riid, LPVOID *ppobj)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
HRESULT hres;
LPUNKNOWN punk;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+ *ppobj = NULL;
hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
+ if (SUCCEEDED(hres)) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
}
- hres = IUnknown_QueryInterface(punk, riid, ppobj);
- if (FAILED(hres)) {
- *ppobj = NULL;
- return hres;
- }
- IUnknown_Release(punk);
return hres;
}
-static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
+static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
More information about the wine-patches
mailing list