Nikolay Sivov : ole32: Merge release code to Release method.

Alexandre Julliard julliard at winehq.org
Thu Apr 18 13:57:25 CDT 2013


Module: wine
Branch: master
Commit: 1b4f3ca6f75dc89d65d4c9396368ebb1dda5a1fa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1b4f3ca6f75dc89d65d4c9396368ebb1dda5a1fa

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 18 10:16:44 2013 +0400

ole32: Merge release code to Release method.

---

 dlls/ole32/stg_stream.c |   62 ++++++++++++++--------------------------------
 1 files changed, 19 insertions(+), 43 deletions(-)

diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c
index e9fc0c0..d7abd0e 100644
--- a/dlls/ole32/stg_stream.c
+++ b/dlls/ole32/stg_stream.c
@@ -43,40 +43,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(storage);
 
-
-/***
- * This is the destructor of the StgStreamImpl class.
- *
- * This method will clean-up all the resources used-up by the given StgStreamImpl
- * class. The pointer passed-in to this function will be freed and will not
- * be valid anymore.
- */
-static void StgStreamImpl_Destroy(StgStreamImpl* This)
-{
-  TRACE("(%p)\n", This);
-
-  /*
-   * Release the reference we are holding on the parent storage.
-   * IStorage_Release(&This->parentStorage->IStorage_iface);
-   *
-   * No, don't do this. Some apps call IStorage_Release without
-   * calling IStream_Release first. If we grab a reference the
-   * file is not closed, and the app fails when it tries to
-   * reopen the file (Easy-PC, for example). Just inform the
-   * storage that we have closed the stream
-   */
-
-  if(This->parentStorage) {
-
-    StorageBaseImpl_RemoveStream(This->parentStorage, This);
-
-  }
-
-  This->parentStorage = 0;
-
-  HeapFree(GetProcessHeap(), 0, This);
-}
-
 /***
  * This implements the IUnknown method QueryInterface for this
  * class
@@ -126,17 +92,27 @@ static ULONG WINAPI StgStreamImpl_Release(
 		IStream* iface)
 {
   StgStreamImpl* This = impl_from_IStream(iface);
+  ULONG ref = InterlockedDecrement(&This->ref);
 
-  ULONG ref;
+  if (!ref)
+  {
+    TRACE("(%p)\n", This);
 
-  ref = InterlockedDecrement(&This->ref);
+    /*
+     * Release the reference we are holding on the parent storage.
+     * IStorage_Release(&This->parentStorage->IStorage_iface);
+     *
+     * No, don't do this. Some apps call IStorage_Release without
+     * calling IStream_Release first. If we grab a reference the
+     * file is not closed, and the app fails when it tries to
+     * reopen the file (Easy-PC, for example). Just inform the
+     * storage that we have closed the stream
+     */
 
-  /*
-   * If the reference count goes down to 0, perform suicide.
-   */
-  if (ref==0)
-  {
-    StgStreamImpl_Destroy(This);
+    if (This->parentStorage)
+      StorageBaseImpl_RemoveStream(This->parentStorage, This);
+    This->parentStorage = 0;
+    HeapFree(GetProcessHeap(), 0, This);
   }
 
   return ref;




More information about the wine-cvs mailing list