From e7a4eae2bb0abc01f23253adb0b8aa6785a988b2 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 22 May 2009 17:19:27 +0000 Subject: [PATCH] - Make ObReferenceObjectEx return the new ref count instead of old ref count. - Fix same bug ObDereferenceObjectEx. - Fix a typo in ObDereferenceObjectEx which resulted in ObpDeferObjectDeletion not being called when needed. Fixes missing object deletions in ObDereferenceObjectEx-using code (e.g. executive timers in reactos kernel). - Original problem found by http://www.reactos.org/forum/viewtopic.php?f=14&t=6969&p=59669, fixes inspired by the discussion too. svn path=/trunk/; revision=41043 --- reactos/ntoskrnl/ob/obref.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ob/obref.c b/reactos/ntoskrnl/ob/obref.c index 0c66bfc9d59..f86a90585ab 100644 --- a/reactos/ntoskrnl/ob/obref.c +++ b/reactos/ntoskrnl/ob/obref.c @@ -80,7 +80,7 @@ ObReferenceObjectEx(IN PVOID Object, /* Increment the reference count and return the count now */ return InterlockedExchangeAdd(&OBJECT_TO_OBJECT_HEADER(Object)-> PointerCount, - Count); + Count) + Count; } LONG @@ -95,8 +95,8 @@ ObDereferenceObjectEx(IN PVOID Object, Header = OBJECT_TO_OBJECT_HEADER(Object); /* Check whether the object can now be deleted. */ - NewCount = InterlockedExchangeAdd(&Header->PointerCount, -Count); - if (!Count) ObpDeferObjectDeletion(Header); + NewCount = InterlockedExchangeAdd(&Header->PointerCount, -Count) - Count; + if (!NewCount) ObpDeferObjectDeletion(Header); /* Return the current count */ return NewCount;