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