- 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
This commit is contained in:
Aleksey Bragin 2009-05-22 17:19:27 +00:00
parent 5826eb2c18
commit e7a4eae2bb

View file

@ -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;