summaryrefslogtreecommitdiff
path: root/src/vm/context.h
diff options
context:
space:
mode:
authordotnet-bot <dotnet-bot@microsoft.com>2015-01-30 14:14:42 -0800
committerdotnet-bot <dotnet-bot@microsoft.com>2015-01-30 14:14:42 -0800
commitef1e2ab328087c61a6878c1e84f4fc5d710aebce (patch)
treedee1bbb89e9d722e16b0d1485e3cdd1b6c8e2cfa /src/vm/context.h
downloadcoreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.gz
coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.bz2
coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.zip
Initial commit to populate CoreCLR repo
[tfs-changeset: 1407945]
Diffstat (limited to 'src/vm/context.h')
-rw-r--r--src/vm/context.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/vm/context.h b/src/vm/context.h
new file mode 100644
index 0000000000..05247df405
--- /dev/null
+++ b/src/vm/context.h
@@ -0,0 +1,231 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+
+#ifndef _H_CONTEXT_
+#define _H_CONTEXT_
+
+#include "specialstatics.h"
+#include "fcall.h"
+
+#ifdef FEATURE_COMINTEROP
+class RCWCache;
+#endif // FEATURE_COMINTEROP
+
+typedef DPTR(class Context) PTR_Context;
+
+#ifdef FEATURE_REMOTING
+
+class Context
+{
+public:
+ enum CallbackType
+ {
+ Wait_callback = 0,
+ MonitorWait_callback = 1,
+ ADTransition_callback = 2,
+ SignalAndWait_callback = 3
+ };
+
+ typedef struct
+ {
+ int numWaiters;
+ HANDLE* waitHandles;
+ BOOL waitAll;
+ DWORD millis;
+ BOOL alertable;
+ DWORD* pResult;
+ } WaitArgs;
+
+ typedef struct
+ {
+ HANDLE* waitHandles;
+ DWORD millis;
+ BOOL alertable;
+ DWORD* pResult;
+ } SignalAndWaitArgs;
+
+ typedef struct
+ {
+ INT32 millis;
+ PendingSync* syncState;
+ BOOL* pResult;
+ } MonitorWaitArgs;
+
+
+ typedef struct
+ {
+ enum CallbackType callbackId;
+ void* callbackData;
+ } CallBackInfo;
+
+ typedef void (*ADCallBackFcnType)(LPVOID);
+
+ struct ADCallBackArgs
+ {
+ ADCallBackFcnType pTarget;
+ LPVOID pArguments;
+ };
+
+#ifdef DACCESS_COMPILE
+ void EnumMemoryRegions(CLRDataEnumMemoryFlags flags);
+#endif
+
+friend class Thread;
+friend class ThreadNative;
+friend class ContextBaseObject;
+friend class CRemotingServices;
+friend struct PendingSync;
+
+ Context(AppDomain *pDomain);
+ ~Context();
+ static void Initialize();
+ PTR_AppDomain GetDomain()
+ {
+ LIMITED_METHOD_DAC_CONTRACT;
+ return m_pDomain;
+ }
+
+ // Get and Set the exposed System.Runtime.Remoting.Context
+ // object which corresponds to this context.
+ OBJECTREF GetExposedObject();
+ OBJECTREF GetExposedObjectRaw();
+ PTR_Object GetExposedObjectRawUnchecked();
+ PTR_PTR_Object GetExposedObjectRawUncheckedPtr();
+ void SetExposedObject(OBJECTREF exposed);
+
+ // Query whether the exposed object exists
+ BOOL IsExposedObjectSet();
+
+ static LPVOID GetStaticFieldAddress(FieldDesc *pFD);
+
+ PTR_VOID GetStaticFieldAddrNoCreate(FieldDesc *pFD);
+
+ static Context* CreateNewContext(AppDomain *pDomain);
+
+ static void FreeContext(Context* victim)
+ {
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ MODE_ANY;
+ PRECONDITION(CheckPointer(victim));
+ }
+ CONTRACTL_END;
+
+ delete victim;
+ }
+
+ static Context* GetExecutionContext(OBJECTREF pObj);
+ static void RequestCallBack(ADID appDomain, Context* targetCtxID, void* privateData);
+
+ // <TODO>Made public to get around the context GC issue </TODO>
+ static BOOL ValidateContext(Context *pCtx);
+
+ inline STATIC_DATA *GetSharedStaticData()
+ {
+ LIMITED_METHOD_CONTRACT;
+ return m_pSharedStaticData;
+ }
+
+ inline void SetSharedStaticData(STATIC_DATA *pData)
+ {
+ LIMITED_METHOD_CONTRACT;
+ m_pSharedStaticData = PTR_STATIC_DATA(pData);
+ }
+
+ inline STATIC_DATA *GetUnsharedStaticData()
+ {
+ LIMITED_METHOD_CONTRACT;
+ return m_pUnsharedStaticData;
+ }
+
+ inline void SetUnsharedStaticData(STATIC_DATA *pData)
+ {
+ LIMITED_METHOD_CONTRACT;
+ m_pUnsharedStaticData = PTR_STATIC_DATA(pData);
+ }
+
+ // Functions called from BCL on a managed context object
+ static FCDECL2(void, SetupInternalContext, ContextBaseObject* pThisUNSAFE, CLR_BOOL bDefault);
+ static FCDECL1(void, CleanupInternalContext, ContextBaseObject* pThisUNSAFE);
+ static FCDECL1(void, ExecuteCallBack, LPVOID privateData);
+
+private:
+ // Static helper functions:
+
+ static void ExecuteWaitCallback(WaitArgs* waitArgs);
+ static void ExecuteMonitorWaitCallback(MonitorWaitArgs* waitArgs);
+ static void ExecuteSignalAndWaitCallback(SignalAndWaitArgs* signalAndWaitArgs);
+ void GetStaticFieldAddressSpecial(FieldDesc *pFD, MethodTable *pMT, int *pSlot, LPVOID *ppvAddress);
+ PTR_VOID CalculateAddressForManagedStatic(int slot);
+
+ // Static Data Members:
+
+ static CrstStatic s_ContextCrst;
+
+
+ // Non-static Data Members:
+ // Pointer to native context static data
+ PTR_STATIC_DATA m_pUnsharedStaticData;
+
+ // Pointer to native context static data
+ PTR_STATIC_DATA m_pSharedStaticData;
+
+ typedef SimpleList<OBJECTHANDLE> ObjectHandleList;
+
+ ObjectHandleList m_PinnedContextStatics;
+
+ // <TODO> CTS. Domains should really be policies on a context and not
+ // entry in the context object. When AppDomains become an attribute of
+ // a context then add the policy.</TODO>
+ PTR_AppDomain m_pDomain;
+
+ OBJECTHANDLE m_ExposedObjectHandle;
+
+ DWORD m_Signature;
+ // NOTE: please maintain the signature as the last member field!!!
+};
+
+FCDECL0(LPVOID, GetPrivateContextsPerfCountersEx);
+
+#else // FEATURE_REMOTING
+
+// if FEATURE_REMOTING is not defined there will be only the default context for each appdomain
+// and contexts will not be exposed to users (so there will be no managed Context class)
+
+class Context
+{
+ PTR_AppDomain m_pDomain;
+
+public:
+#ifndef DACCESS_COMPILE
+ Context(AppDomain *pDomain)
+ {
+ m_pDomain = pDomain;
+ }
+#endif
+
+ PTR_AppDomain GetDomain()
+ {
+ LIMITED_METHOD_DAC_CONTRACT;
+ return m_pDomain;
+ }
+
+ static void Initialize()
+ {
+ }
+
+ typedef void (*ADCallBackFcnType)(LPVOID);
+
+#ifdef DACCESS_COMPILE
+ void EnumMemoryRegions(CLRDataEnumMemoryFlags flags);
+#endif
+};
+
+#endif // FEATURE_REMOTING
+
+#endif