diff --git a/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs index 71aff544f92c27..aeba970b274448 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs @@ -12,10 +12,10 @@ namespace System { public static partial class Environment { - public static extern int CurrentManagedThreadId + public static int CurrentManagedThreadId { - [MethodImpl(MethodImplOptions.InternalCall)] - get; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => Threading.ManagedThreadId.Current; } // Terminates this process with the given exit code. diff --git a/src/coreclr/inc/jithelpers.h b/src/coreclr/inc/jithelpers.h index 281302ccbc742c..7742945b23e7e4 100644 --- a/src/coreclr/inc/jithelpers.h +++ b/src/coreclr/inc/jithelpers.h @@ -224,7 +224,7 @@ JITHELPER(CORINFO_HELP_TAILCALL, NULL, METHOD__NIL) #endif - JITHELPER(CORINFO_HELP_GETCURRENTMANAGEDTHREADID, JIT_GetCurrentManagedThreadId, METHOD__NIL) + DYNAMICJITHELPER(CORINFO_HELP_GETCURRENTMANAGEDTHREADID, NULL, METHOD__ENVIRONMENT__CURRENT_MANAGED_THREAD_ID) JITHELPER(CORINFO_HELP_INIT_PINVOKE_FRAME, JIT_InitPInvokeFrame, METHOD__NIL) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 8f6b7e101437d1..a0340343c58c44 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -4314,7 +4314,21 @@ GenTree* Compiler::impIntrinsic(CORINFO_CLASS_HANDLE clsHnd, // drop get_CurrentThread() call impPopStack(); call->ReplaceWith(gtNewNothingNode(), this); - retNode = gtNewHelperCallNode(CORINFO_HELP_GETCURRENTMANAGEDTHREADID, TYP_INT); + GenTreeCall* tidCall = gtNewHelperCallNode(CORINFO_HELP_GETCURRENTMANAGEDTHREADID, TYP_INT); + impConvertToUserCallAndMarkForInlining(tidCall); + if (tidCall->IsInlineCandidate()) + { + // The helper was converted into an inlinable user call; spill it to its own + // statement and hand back a GT_RET_EXPR so the inliner can fold the property. + impAppendTree(tidCall, CHECK_SPILL_ALL, impCurStmtDI, false); + GenTreeRetExpr* retExpr = gtNewInlineCandidateReturnExpr(tidCall, TYP_INT); + tidCall->GetSingleInlineCandidateInfo()->retExpr = retExpr; + retNode = retExpr; + } + else + { + retNode = tidCall; + } } } } diff --git a/src/coreclr/vm/corelib.h b/src/coreclr/vm/corelib.h index 2db9241ecbe031..fa6f4000edaa7e 100644 --- a/src/coreclr/vm/corelib.h +++ b/src/coreclr/vm/corelib.h @@ -278,6 +278,7 @@ DEFINE_CLASS(RUNE, Text, Rune) DEFINE_CLASS(ENUM, System, Enum) DEFINE_CLASS(ENVIRONMENT, System, Environment) +DEFINE_METHOD(ENVIRONMENT, CURRENT_MANAGED_THREAD_ID, get_CurrentManagedThreadId, NoSig) DEFINE_METHOD(ENVIRONMENT, GET_RESOURCE_STRING, GetResourceString, SM_PtrChar_PtrStr_PtrException_RetVoid) DEFINE_METHOD(ENVIRONMENT, INITIALIZE_COMMAND_LINE_ARGS, InitializeCommandLineArgs, SM_PtrChar_Int_PtrPtrChar_PtrArrStr_PtrException_RetVoid) DEFINE_METHOD(ENVIRONMENT, CALL_ENTRY_POINT, CallEntryPoint, SM_IntPtr_PtrArrStr_PtrInt_Bool_PtrException_RetVoid) diff --git a/src/coreclr/vm/ecalllist.h b/src/coreclr/vm/ecalllist.h index 0bcf6eb37169fc..d0ac7d28c6f747 100644 --- a/src/coreclr/vm/ecalllist.h +++ b/src/coreclr/vm/ecalllist.h @@ -68,7 +68,6 @@ FCFuncStart(gStringFuncs) FCFuncEnd() FCFuncStart(gEnvironmentFuncs) - FCFuncElement("get_CurrentManagedThreadId", JIT_GetCurrentManagedThreadId) FCFuncElement("set_ExitCode", EnvironmentNative::SetExitCode) FCFuncElement("get_ExitCode", EnvironmentNative::GetExitCode) FCFuncEnd() diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index d5a7e922521e0c..42b5bc31a938f9 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1202,15 +1202,6 @@ void JIT_RareDisableHelper() } } -FCIMPL0(INT32, JIT_GetCurrentManagedThreadId) -{ - FCALL_CONTRACT; - - Thread * pThread = GetThread(); - return pThread->GetThreadId(); -} -FCIMPLEND - /*********************************************************************/ /* we don't use HCIMPL macros because we don't want the overhead even in debug mode */ diff --git a/src/coreclr/vm/jitinterface.h b/src/coreclr/vm/jitinterface.h index aebb381a0bf37d..d30c9278eb0a25 100644 --- a/src/coreclr/vm/jitinterface.h +++ b/src/coreclr/vm/jitinterface.h @@ -179,8 +179,6 @@ EXTERN_C FCDECL1(void*, JIT_GetGCStaticBase_Helper, MethodTable *pMT); EXTERN_C void DoJITFailFast(); EXTERN_C FCDECL0(void, JIT_FailFast); -FCDECL0(int, JIT_GetCurrentManagedThreadId); - EXTERN_C void ReversePInvokeBadTransition(); #if !defined(FEATURE_USE_ASM_GC_WRITE_BARRIERS) && defined(FEATURE_COUNT_GC_WRITE_BARRIERS)