don't increment the lock count twice in RtlTryEnterCriticalSection() and
added some more comments
Modified: trunk/reactos/lib/ntdll/rtl/critical.c
_____
Modified: trunk/reactos/lib/ntdll/rtl/critical.c
--- trunk/reactos/lib/ntdll/rtl/critical.c 2005-02-19 13:13:17 UTC
(rev 13641)
+++ trunk/reactos/lib/ntdll/rtl/critical.c 2005-02-19 13:44:56 UTC
(rev 13642)
@@ -305,27 +305,33 @@
RtlLeaveCriticalSection(
PRTL_CRITICAL_SECTION CriticalSection)
{
+#ifndef NDEBUG
HANDLE Thread = (HANDLE)NtCurrentTeb()->Cid.UniqueThread;
+ /* In win this case isn't checked. However it's a valid check so it
should only
+ be performed in debug builds! */
if (Thread != CriticalSection->OwningThread)
{
DPRINT1("Releasing critical section not owned!\n");
- /* FIXME: raise exception */
return STATUS_INVALID_PARAMETER;
}
+#endif
- /* Decrease the Recursion Count */
+ /* Decrease the Recursion Count. No need to do this atomically
because only
+ the thread who holds the lock can call this function (unless the
program
+ is totally screwed... */
if (--CriticalSection->RecursionCount) {
- /* Someone still owns us, but we are free */
+ /* Someone still owns us, but we are free. This needs to be
done atomically. */
InterlockedDecrement(&CriticalSection->LockCount);
} else {
- /* Nobody owns us anymore */
+ /* Nobody owns us anymore. No need to do this atomically. See
comment
+ above. */
CriticalSection->OwningThread = 0;
- /* Was someone wanting us? */
+ /* Was someone wanting us? This needs to be done atomically. */
if (InterlockedDecrement(&CriticalSection->LockCount) >= 0) {
/* Let him have us */
@@ -360,19 +366,19 @@
PRTL_CRITICAL_SECTION CriticalSection)
{
/* Try to take control */
- if (InterlockedCompareExchange(&CriticalSection->LockCount,
- 0,
- -1) == -1) {
+ if (InterlockedCompareExchange(&CriticalSection->LockCount, 0, -1)
== -1) {
- /* It's ours */
+ /* It's ours. Changing this information does not have to be
serialized
+ because we just obtained the lock. */
CriticalSection->OwningThread =
NtCurrentTeb()->Cid.UniqueThread;
CriticalSection->RecursionCount = 1;
return TRUE;
} else if (CriticalSection->OwningThread ==
NtCurrentTeb()->Cid.UniqueThread) {
- /* It's already ours */
- InterlockedIncrement(&CriticalSection->LockCount);
+ /* It's already ours, just increment the recursion counter.
This doesn't
+ have to be serialized because only the thread who already
holds the
+ lock can do this. */
CriticalSection->RecursionCount++;
return TRUE;
}