summaryrefslogtreecommitdiff
path: root/src/vm/comsynchronizable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/comsynchronizable.h')
-rw-r--r--src/vm/comsynchronizable.h158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/vm/comsynchronizable.h b/src/vm/comsynchronizable.h
new file mode 100644
index 0000000000..65ec21228b
--- /dev/null
+++ b/src/vm/comsynchronizable.h
@@ -0,0 +1,158 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+/*============================================================
+**
+** Header: COMSynchronizable.h
+**
+** Purpose: Native methods on System.SynchronizableObject
+** and its subclasses.
+**
+**
+===========================================================*/
+
+#ifndef _COMSYNCHRONIZABLE_H
+#define _COMSYNCHRONIZABLE_H
+
+#include "field.h" // For FieldDesc definition.
+
+//
+// Each function that we call through native only gets one argument,
+// which is actually a pointer to its stack of arguments. Our structs
+// for accessing these are defined below.
+//
+
+struct SharedState;
+
+class ThreadNative
+{
+friend class ThreadBaseObject;
+
+public:
+
+ enum
+ {
+ PRIORITY_LOWEST = 0,
+ PRIORITY_BELOW_NORMAL = 1,
+ PRIORITY_NORMAL = 2,
+ PRIORITY_ABOVE_NORMAL = 3,
+ PRIORITY_HIGHEST = 4,
+ };
+
+ enum
+ {
+ ThreadStopRequested = 1,
+ ThreadSuspendRequested = 2,
+ ThreadBackground = 4,
+ ThreadUnstarted = 8,
+ ThreadStopped = 16,
+ ThreadWaitSleepJoin = 32,
+ ThreadSuspended = 64,
+ ThreadAbortRequested = 128,
+ ThreadAborted = 256,
+ };
+
+ enum
+ {
+ ApartmentSTA = 0,
+ ApartmentMTA = 1,
+ ApartmentUnknown = 2
+ };
+
+ static LPVOID F_CALL_CONV FastGetCurrentThread();
+ static LPVOID F_CALL_CONV FastGetDomain();
+
+ static void StartInner(ThreadBaseObject* pThisUNSAFE, Object* pPrincipalUNSAFE, StackCrawlMark* pStackMark);
+
+ static FCDECL1(void, Abort, ThreadBaseObject* pThis);
+ static FCDECL1(void, ResetAbort, ThreadBaseObject* pThis);
+ static FCDECL3(void, Start, ThreadBaseObject* pThisUNSAFE, Object* pPrincipalUNSAFE, StackCrawlMark* pStackMark);
+#ifndef FEATURE_CORECLR
+ static FCDECL1(void, Suspend, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL1(void, Resume, ThreadBaseObject* pThisUNSAFE);
+#endif // FEATURE_CORECLR
+ static FCDECL1(INT32, GetPriority, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL2(void, SetPriority, ThreadBaseObject* pThisUNSAFE, INT32 iPriority);
+ static FCDECL1(void, Interrupt, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL1(FC_BOOL_RET, IsAlive, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL2(FC_BOOL_RET, Join, ThreadBaseObject* pThisUNSAFE, INT32 Timeout);
+#undef Sleep
+ static FCDECL1(void, Sleep, INT32 iTime);
+#define Sleep(a) Dont_Use_Sleep(a)
+ static FCDECL3(void, SetStart, ThreadBaseObject* pThisUNSAFE, Object* pDelegateUNSAFE, INT32 iRequestedStackSize);
+ static FCDECL2(void, SetBackground, ThreadBaseObject* pThisUNSAFE, CLR_BOOL isBackground);
+ static FCDECL1(FC_BOOL_RET, IsBackground, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL1(INT32, GetThreadState, ThreadBaseObject* pThisUNSAFE);
+ static FCDECL1(INT32, GetThreadContext, ThreadBaseObject* pThisUNSAFE);
+#ifdef FEATURE_COMINTEROP_APARTMENT_SUPPORT
+ static FCDECL1(INT32, GetApartmentState, ThreadBaseObject* pThis);
+ static FCDECL3(INT32, SetApartmentState, ThreadBaseObject* pThisUNSAFE, INT32 iState, CLR_BOOL fireMDAOnMismatch);
+ static FCDECL1(void, StartupSetApartmentState, ThreadBaseObject* pThis);
+#endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT
+ static FCDECL0(Object*, GetDomain);
+#ifdef FEATURE_REMOTING
+ static FCDECL1(Object*, GetContextFromContextID, LPVOID ContextID);
+ static FCDECL6(Object*, InternalCrossContextCallback, ThreadBaseObject* refThis, ContextBaseObject* refContext, LPVOID contextID, INT32 appDomainId, Object* oDelegateUNSAFE, PtrArray* oArgsUNSAFE);
+#endif
+#ifdef FEATURE_LEAK_CULTURE_INFO
+ static FCDECL4(FC_BOOL_RET, nativeGetSafeCulture, ThreadBaseObject* threadUNSAFE, int appDomainId, CLR_BOOL isUI, OBJECTREF *safeCulture);
+#else
+ static void QCALLTYPE nativeInitCultureAccessors();
+#endif
+
+ static
+ void QCALLTYPE InformThreadNameChange(QCall::ThreadHandle thread, LPCWSTR name, INT32 len);
+
+ static
+ UINT64 QCALLTYPE GetProcessDefaultStackSize();
+
+ static FCDECL1(INT32, GetManagedThreadId, ThreadBaseObject* th);
+#ifndef FEATURE_CORECLR
+ static FCDECL0(void, BeginCriticalRegion);
+ static FCDECL0(void, EndCriticalRegion);
+ static FCDECL0(void, BeginThreadAffinity);
+ static FCDECL0(void, EndThreadAffinity);
+#endif // !FEATURE_CORECLR
+ static FCDECL1(void, SpinWait, int iterations);
+ static BOOL QCALLTYPE YieldThread();
+ static FCDECL0(Object*, GetCurrentThread);
+ static FCDECL1(void, Finalize, ThreadBaseObject* pThis);
+#ifdef FEATURE_COMINTEROP
+ static FCDECL1(void, DisableComObjectEagerCleanup, ThreadBaseObject* pThis);
+#endif //FEATURE_COMINTEROP
+#ifdef FEATURE_LEAK_CULTURE_INFO
+ static FCDECL1(FC_BOOL_RET,SetThreadUILocale, StringObject* localeNameUNSAFE);
+#endif // FEATURE_LEAK_CULTURE_INFO
+ static FCDECL1(FC_BOOL_RET,IsThreadpoolThread, ThreadBaseObject* thread);
+#ifdef FEATURE_COMPRESSEDSTACK
+ static FCDECL2(void*, SetAppDomainStack, ThreadBaseObject* pThis, SafeHandle* hcsUNSAFE);
+ static FCDECL2(void, RestoreAppDomainStack, ThreadBaseObject* pThis, void* appDomainStack);
+#endif // #ifdef FEATURE_COMPRESSEDSTACK
+
+ static FCDECL0(void, FCMemoryBarrier);
+ static FCDECL1(void, SetIsThreadStaticsArray, Object* pObject);
+
+ static FCDECL2(void, SetAbortReason, ThreadBaseObject* pThisUNSAFE, Object* pObject);
+#ifndef FEATURE_CORECLR
+ static FCDECL1(Object*, GetAbortReason, ThreadBaseObject* pThisUNSAFE);
+#endif
+ static FCDECL1(void, ClearAbortReason, ThreadBaseObject* pThisUNSAFE);
+
+private:
+
+ struct KickOffThread_Args {
+ Thread *pThread;
+ SharedState *share;
+ ULONG retVal;
+ };
+
+ static void KickOffThread_Worker(LPVOID /* KickOffThread_Args* */);
+ static ULONG __stdcall KickOffThread(void *pass);
+ static BOOL DoJoin(THREADBASEREF DyingThread, INT32 timeout);
+};
+
+
+#endif // _COMSYNCHRONIZABLE_H
+