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