diff --git a/src/coreclr/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs index 05a418e2f986a0..c271c2a3d55278 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs @@ -59,7 +59,7 @@ private enum LeaveHelperAction Yield = 2, Contention = 3, Error = 4, - }; + } [MethodImpl(MethodImplOptions.InternalCall)] private static extern EnterHelperResult TryEnter_FastPath_WithTimeout(object obj, int timeout); @@ -92,6 +92,8 @@ private static bool TryEnter_Slowpath(object obj) [MethodImpl(MethodImplOptions.NoInlining)] private static bool TryEnter_Slowpath(object obj, int timeout) { + ArgumentOutOfRangeException.ThrowIfLessThan(timeout, -1, null); + if (TryEnter_Slowpath(ObjectHandleOnStack.Create(ref obj), timeout) != 0) { return true; @@ -170,13 +172,12 @@ internal static void ExitIfLockTaken(object obj, ref bool lockTaken) { LeaveHelperAction exitBehavior = Exit_FastPath(obj); - if (exitBehavior == LeaveHelperAction.None) + if (exitBehavior != LeaveHelperAction.None) { - lockTaken = false; + Exit_Slowpath(exitBehavior, obj); return; } - Exit_Slowpath(exitBehavior, obj); lockTaken = false; } } diff --git a/src/coreclr/classlibnative/bcltype/objectnative.cpp b/src/coreclr/classlibnative/bcltype/objectnative.cpp index 791745075c9c7c..2a06cf22e737be 100644 --- a/src/coreclr/classlibnative/bcltype/objectnative.cpp +++ b/src/coreclr/classlibnative/bcltype/objectnative.cpp @@ -224,14 +224,7 @@ FCIMPL1(FC_BOOL_RET, ObjectNative::Monitor_TryEnter_FastPath, Object* obj) { FCALL_CONTRACT; - if (obj->TryEnterObjMonitorSpinHelper()) - { - FC_RETURN_BOOL(TRUE); - } - else - { - FC_RETURN_BOOL(FALSE); - } + FC_RETURN_BOOL(obj->TryEnterObjMonitorSpinHelper()); } FCIMPLEND @@ -274,8 +267,7 @@ extern "C" INT32 QCALLTYPE Monitor_TryEnter_Slowpath(QCall::ObjectHandleOnStack GCX_COOP(); - if (timeOut < -1) - COMPlusThrow(kArgumentOutOfRangeException); + _ASSERTE(timeOut >= -1); // This should be checked in managed code. result = objHandle.Get()->TryEnterObjMonitor(timeOut);