| 1 | // Licensed to the .NET Foundation under one or more agreements. |
| 2 | // The .NET Foundation licenses this file to you under the MIT license. |
| 3 | // See the LICENSE file in the project root for more information. |
| 4 | |
| 5 | |
| 6 | |
| 7 | #ifndef __PREDEFTLSSLOT_H__ |
| 8 | #define __PREDEFTLSSLOT_H__ |
| 9 | |
| 10 | |
| 11 | // And here are the predefined slots for accessing TLS from various DLLs of the CLR. |
| 12 | // Note that we want to support combinations of Debug and Retail DLLs for testing |
| 13 | // purposes, so we burn the slots into the retail EE even if a debug CLR dll needs |
| 14 | // them. |
| 15 | enum PredefinedTlsSlots |
| 16 | { |
| 17 | TlsIdx_StrongName, |
| 18 | TlsIdx_JitPerf, |
| 19 | TlsIdx_JitX86Perf, |
| 20 | TlsIdx_JitLogEnv, |
| 21 | TlsIdx_IceCap, |
| 22 | TlsIdx_StressLog, |
| 23 | TlsIdx_StackProbe, |
| 24 | TlsIdx_Check, |
| 25 | TlsIdx_ForbidGCLoaderUseCount, |
| 26 | TlsIdx_ClrDebugState, // Pointer to ClrDebugState* structure |
| 27 | TlsIdx_StressThread, |
| 28 | |
| 29 | // Add more indices here. |
| 30 | TlsIdx_ThreadType, // bit flags to indicate special thread's type |
| 31 | TlsIdx_CantStopCount, // Can't-stop counter for any thread |
| 32 | TlsIdx_OwnedCrstsChain, // slot to store the Crsts owned by this thread |
| 33 | TlsIdx_AppDomainAgilePendingTable, |
| 34 | TlsIdx_CantAllocCount, //Can't allocate memory on heap in this thread |
| 35 | TlsIdx_AssertDlgStatus, // Whether the thread is displaying an assert dialog |
| 36 | |
| 37 | // A transient thread value that indicates this thread is currently walking its stack |
| 38 | // or the stack of another thread. This value is useful to help short-circuit |
| 39 | // some problematic checks in the loader, guarantee that types & assemblies |
| 40 | // encountered during the walk must already be loaded, and provide information to control |
| 41 | // assembly loading behavior during stack walks. |
| 42 | // |
| 43 | // This value is set around the main portions of the stack walk (as those portions may |
| 44 | // enter the type & assembly loaders). This is also explicitly cleared while the |
| 45 | // walking thread calls the stackwalker callback or needs to execute managed code, as |
| 46 | // such calls may execute arbitrary code unrelated to the actual stack walking, and |
| 47 | // may never return, in the case of exception stackwalk callbacks. |
| 48 | TlsIdx_StackWalkerWalkingThread, // Thread* that the stack walker is currently walking. |
| 49 | |
| 50 | // Save the last exception info. Sometimes we need this info in our EX_CATCH, such as for SO. |
| 51 | // It will be better if VC can supply this in catch(...) block. |
| 52 | // !!! These data may become stale. Use it only inside exception handling code. |
| 53 | // !!! Please access these fields through GetCurrentExceptionPointers which validates the data to some level. |
| 54 | TlsIdx_EXCEPTION_CODE, |
| 55 | TlsIdx_PEXCEPTION_RECORD, |
| 56 | TlsIdx_PCONTEXT, |
| 57 | |
| 58 | TlsIdx_SOIntolerantTransitionHandler, // The thread is entering SO intolerant code. This one is used by |
| 59 | // Thread::IsSOIntolerant to decide the SO mode of the thread. |
| 60 | MAX_PREDEFINED_TLS_SLOT |
| 61 | }; |
| 62 | |
| 63 | enum TlsThreadTypeFlag // flag used for thread type in Tls data |
| 64 | { |
| 65 | ThreadType_GC = 0x00000001, |
| 66 | ThreadType_Timer = 0x00000002, |
| 67 | ThreadType_Gate = 0x00000004, |
| 68 | ThreadType_DbgHelper = 0x00000008, |
| 69 | ThreadType_Shutdown = 0x00000010, |
| 70 | ThreadType_DynamicSuspendEE = 0x00000020, |
| 71 | ThreadType_Finalizer = 0x00000040, |
| 72 | ThreadType_ADUnloadHelper = 0x00000200, |
| 73 | ThreadType_ShutdownHelper = 0x00000400, |
| 74 | ThreadType_Threadpool_IOCompletion = 0x00000800, |
| 75 | ThreadType_Threadpool_Worker = 0x00001000, |
| 76 | ThreadType_Wait = 0x00002000, |
| 77 | ThreadType_ProfAPI_Attach = 0x00004000, |
| 78 | ThreadType_ProfAPI_Detach = 0x00008000, |
| 79 | ThreadType_ETWRundownThread = 0x00010000, |
| 80 | ThreadType_GenericInstantiationCompare= 0x00020000, // Used to indicate that the thread is determining if a generic instantiation in an ngen image matches a lookup. |
| 81 | }; |
| 82 | |
| 83 | #endif |
| 84 | |
| 85 | |