From 1b4f3ca6f75dc89d65d4c9396368ebb1dda5a1fa Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 18 Apr 2013 10:16:44 +0400 Subject: [PATCH] ole32: Merge release code to Release method. --- dlls/ole32/stg_stream.c | 60 +++++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/dlls/ole32/stg_stream.c b/dlls/ole32/stg_stream.c index e9fc0c0b76e..d7abd0e2dbc 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; -- 2.11.4.GIT