summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2015-10-15 07:14:05 -0700
committerJan Kotas <jkotas@microsoft.com>2015-10-15 08:37:24 -0700
commit38034a26ff4e40e98d1af32abe5baef2c3eeea52 (patch)
tree987ede790cce6f2540f0e74ee71da961eb826f7b /src/vm
parentc826885f85991fbeb1e99930f08ba4c3c4b8f9a8 (diff)
downloadcoreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.tar.gz
coreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.tar.bz2
coreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.zip
Cleanup GC-EE Interface
- Add proper abstractions for threading methods to GCToEEInterface - Split sample gcenv into multiple files to avoid redundant content - Add handle table methods needed by .NET Native WinRT implementation Part of #1550
Diffstat (limited to 'src/vm')
-rw-r--r--src/vm/gcenv.cpp45
-rw-r--r--src/vm/gcenv.h28
-rw-r--r--src/vm/jitinterface.cpp2
3 files changed, 74 insertions, 1 deletions
diff --git a/src/vm/gcenv.cpp b/src/vm/gcenv.cpp
index 963ca3ac36..7ed4328a1f 100644
--- a/src/vm/gcenv.cpp
+++ b/src/vm/gcenv.cpp
@@ -21,6 +21,7 @@
#ifdef FEATURE_COMINTEROP
#include "runtimecallablewrapper.h"
#include "rcwwalker.h"
+#include "comcallablewrapper.h"
#endif // FEATURE_COMINTEROP
void GCToEEInterface::SuspendEE(SUSPEND_REASON reason)
@@ -611,6 +612,26 @@ void GCToEEInterface::GcDone(int condemned)
#endif // FEATURE_COMINTEROP
}
+bool GCToEEInterface::RefCountedHandleCallbacks(Object * pObject)
+{
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ }
+ CONTRACTL_END;
+
+#ifdef FEATURE_COMINTEROP
+ //<REVISIT_TODO>@todo optimize the access to the ref-count
+ ComCallWrapper* pWrap = ComCallWrapper::GetWrapperForObject((OBJECTREF)pObject);
+ _ASSERTE(pWrap != NULL);
+
+ return !!pWrap->IsWrapperActive();
+#else
+ return false;
+#endif
+}
+
void GCToEEInterface::GcBeforeBGCSweepWork()
{
CONTRACTL
@@ -649,3 +670,27 @@ void GCToEEInterface::SyncBlockCachePromotionsGranted(int max_gen)
SyncBlockCache::GetSyncBlockCache()->GCDone(FALSE, max_gen);
}
+
+void GCToEEInterface::SetGCSpecial(Thread * pThread)
+{
+ WRAPPER_NO_CONTRACT;
+ pThread->SetGCSpecial(true);
+}
+
+alloc_context * GCToEEInterface::GetAllocContext(Thread * pThread)
+{
+ WRAPPER_NO_CONTRACT;
+ return pThread->GetAllocContext();
+}
+
+bool GCToEEInterface::CatchAtSafePoint(Thread * pThread)
+{
+ WRAPPER_NO_CONTRACT;
+ return !!pThread->CatchAtSafePoint();
+}
+
+Thread * GCToEEInterface::GetThreadList(Thread * pThread)
+{
+ WRAPPER_NO_CONTRACT;
+ return ThreadStore::GetThreadList(pThread);
+}
diff --git a/src/vm/gcenv.h b/src/vm/gcenv.h
index fc5ca6de86..5816d0259e 100644
--- a/src/vm/gcenv.h
+++ b/src/vm/gcenv.h
@@ -99,10 +99,38 @@ public:
// post-gc callback.
static void GcDone(int condemned);
+ // Promote refcounted handle callback
+ static bool RefCountedHandleCallbacks(Object * pObject);
+
// Sync block cache management
static void SyncBlockCacheWeakPtrScan(HANDLESCANPROC scanProc, LPARAM lp1, LPARAM lp2);
static void SyncBlockCacheDemote(int max_gen);
static void SyncBlockCachePromotionsGranted(int max_gen);
+
+ // Thread functions
+ static bool IsPreemptiveGCDisabled(Thread * pThread)
+ {
+ WRAPPER_NO_CONTRACT;
+ return !!pThread->PreemptiveGCDisabled();
+ }
+
+ static void EnablePreemptiveGC(Thread * pThread)
+ {
+ WRAPPER_NO_CONTRACT;
+ pThread->EnablePreemptiveGC();
+ }
+
+ static void DisablePreemptiveGC(Thread * pThread)
+ {
+ WRAPPER_NO_CONTRACT;
+ pThread->DisablePreemptiveGC();
+ }
+
+ static void SetGCSpecial(Thread * pThread);
+ static alloc_context * GetAllocContext(Thread * pThread);
+ static bool CatchAtSafePoint(Thread * pThread);
+
+ static Thread * GetThreadList(Thread * pThread);
};
#endif // GCENV_H_ \ No newline at end of file
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp
index ba0c8ba731..ba6aebb3cc 100644
--- a/src/vm/jitinterface.cpp
+++ b/src/vm/jitinterface.cpp
@@ -6269,7 +6269,7 @@ CorInfoHelpFunc CEEInfo::getNewHelperStatic(MethodTable * pMT)
_ASSERTE(helper == CORINFO_HELP_NEWFAST);
}
else
- if (GCHeap::IsLargeObject(pMT) ||
+ if ((pMT->GetBaseSize() >= LARGE_OBJECT_SIZE) ||
pMT->HasFinalizer())
{
// Use slow helper