Module: wine
Branch: master
Commit: 1b4f3ca6f75dc89d65d4c9396368ebb1dda5a1fa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1b4f3ca6f75dc89d65d4c9396…
Author: Nikolay Sivov <nsivov(a)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;