diff options
author | Jan Kotas <jkotas@microsoft.com> | 2015-10-15 07:14:05 -0700 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2015-10-15 08:37:24 -0700 |
commit | 38034a26ff4e40e98d1af32abe5baef2c3eeea52 (patch) | |
tree | 987ede790cce6f2540f0e74ee71da961eb826f7b /src/vm | |
parent | c826885f85991fbeb1e99930f08ba4c3c4b8f9a8 (diff) | |
download | coreclr-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.cpp | 45 | ||||
-rw-r--r-- | src/vm/gcenv.h | 28 | ||||
-rw-r--r-- | src/vm/jitinterface.cpp | 2 |
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 |