diff options
author | Sean Gillespie <segilles@microsoft.com> | 2017-12-12 19:04:07 -0800 |
---|---|---|
committer | Sean Gillespie <segilles@microsoft.com> | 2017-12-12 19:04:07 -0800 |
commit | 8df01f50ca980ab8840124c74037782f75702032 (patch) | |
tree | 67632498038f401758197663622b1f32a4603eeb /src/vm | |
parent | 3a295a078701f72edc18a4404cab7b7e1bc104c7 (diff) | |
download | coreclr-8df01f50ca980ab8840124c74037782f75702032.tar.gz coreclr-8df01f50ca980ab8840124c74037782f75702032.tar.bz2 coreclr-8df01f50ca980ab8840124c74037782f75702032.zip |
Revert "[Local GC] Move knowledge of overlapped I/O objects to the EE through four callbacks (#14982)"
This reverts commit c755e3b7f5d597c8d192675dbaaa337268d93f1c.
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/appdomain.cpp | 38 | ||||
-rw-r--r-- | src/vm/gcenv.ee.cpp | 81 | ||||
-rw-r--r-- | src/vm/gcenv.ee.h | 2 | ||||
-rw-r--r-- | src/vm/gcenv.ee.standalone.cpp | 3 | ||||
-rw-r--r-- | src/vm/gcenv.ee.static.cpp | 3 |
5 files changed, 5 insertions, 122 deletions
diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp index 07e3280342..370847c9a2 100644 --- a/src/vm/appdomain.cpp +++ b/src/vm/appdomain.cpp @@ -9053,43 +9053,7 @@ void AppDomain::HandleAsyncPinHandles() // 4. Then we can delete all AsyncPinHandle marked with READYTOCLEAN. IGCHandleStore *pBucketInDefault = SystemDomain::System()->DefaultDomain()->m_handleStore; - auto clearIfComplete = [](Object* object) - { - LIMITED_METHOD_CONTRACT; - - assert(object != nullptr); - if (object->GetGCSafeMethodTable() != g_pOverlappedDataClass) - { - return; - } - - OVERLAPPEDDATAREF overlapped = (OVERLAPPEDDATAREF)(ObjectToOBJECTREF((Object*)object)); - if (overlapped->HasCompleted()) - { - // IO has finished. We don't need to pin the user buffer any longer. - overlapped->m_userObject = NULL; - } - - BashMTForPinnedObject(ObjectToOBJECTREF(object)); - }; - - auto setHandle = [](Object* object, OBJECTHANDLE handle) - { - LIMITED_METHOD_CONTRACT; - - assert(object != nullptr); - assert(handle); - - if (object->GetGCSafeMethodTable() != g_pOverlappedDataClass) - { - return; - } - - OverlappedDataObject* overlapped = (OverlappedDataObject*)object; - overlapped->m_pinSelf = handle; - }; - - pBucket->RelocateAsyncPinnedHandles(pBucketInDefault, clearIfComplete, setHandle); + pBucket->RelocateAsyncPinnedHandles(pBucketInDefault); OverlappedDataObject::RequestCleanup(); } diff --git a/src/vm/gcenv.ee.cpp b/src/vm/gcenv.ee.cpp index a880fdbca6..e5da889a64 100644 --- a/src/vm/gcenv.ee.cpp +++ b/src/vm/gcenv.ee.cpp @@ -1201,7 +1201,7 @@ namespace }; InlineSString<MaxThreadNameSize> wideName; - const WCHAR* namePtr = nullptr; + const WCHAR* namePtr; EX_TRY { if (name != nullptr) @@ -1214,6 +1214,7 @@ namespace { // we're not obligated to provide a name - if it's not valid, // just report nullptr as the name. + namePtr = nullptr; } EX_END_CATCH(SwallowAllExceptions) @@ -1306,81 +1307,3 @@ bool GCToEEInterface::CreateThread(void (*threadStart)(void*), void* arg, bool i return CreateNonSuspendableThread(threadStart, arg, name); } } - -void GCToEEInterface::WalkAsyncPinnedForPromotion(Object* object, ScanContext* sc, promote_func* callback) -{ - LIMITED_METHOD_CONTRACT; - - assert(object != nullptr); - assert(sc != nullptr); - assert(callback != nullptr); - if (object->GetGCSafeMethodTable() != g_pOverlappedDataClass) - { - // not an overlapped data object - nothing to do. - return; - } - - // reporting the pinned user objects - OverlappedDataObject *pOverlapped = (OverlappedDataObject *)object; - if (pOverlapped->m_userObject != NULL) - { - //callback(OBJECTREF_TO_UNCHECKED_OBJECTREF(pOverlapped->m_userObject), (ScanContext *)lp1, GC_CALL_PINNED); - if (pOverlapped->m_isArray) - { - // OverlappedDataObject is very special. An async pin handle keeps it alive. - // During GC, we also make sure - // 1. m_userObject itself does not move if m_userObject is not array - // 2. Every object pointed by m_userObject does not move if m_userObject is array - // We do not want to pin m_userObject if it is array. But m_userObject may be updated - // during relocation phase before OverlappedDataObject is doing relocation. - // m_userObjectInternal is used to track the location of the m_userObject before it is updated. - pOverlapped->m_userObjectInternal = static_cast<void*>(OBJECTREFToObject(pOverlapped->m_userObject)); - ArrayBase* pUserObject = (ArrayBase*)OBJECTREFToObject(pOverlapped->m_userObject); - Object **ppObj = (Object**)pUserObject->GetDataPtr(TRUE); - size_t num = pUserObject->GetNumComponents(); - for (size_t i = 0; i < num; i++) - { - callback(ppObj + i, sc, GC_CALL_PINNED); - } - } - else - { - callback(&OBJECTREF_TO_UNCHECKED_OBJECTREF(pOverlapped->m_userObject), (ScanContext *)sc, GC_CALL_PINNED); - } - } - - if (pOverlapped->GetAppDomainId() != DefaultADID && pOverlapped->GetAppDomainIndex().m_dwIndex == DefaultADID) - { - OverlappedDataObject::MarkCleanupNeededFromGC(); - } -} - -void GCToEEInterface::WalkAsyncPinned(Object* object, void* context, void (*callback)(Object*, Object*, void*)) -{ - LIMITED_METHOD_CONTRACT; - - assert(object != nullptr); - assert(callback != nullptr); - - if (object->GetGCSafeMethodTable() != g_pOverlappedDataClass) - { - return; - } - - OverlappedDataObject *pOverlapped = (OverlappedDataObject *)(object); - if (pOverlapped->m_userObject != NULL) - { - Object * pUserObject = OBJECTREFToObject(pOverlapped->m_userObject); - callback(object, pUserObject, context); - if (pOverlapped->m_isArray) - { - ArrayBase* pUserArrayObject = (ArrayBase*)pUserObject; - Object **pObj = (Object**)pUserArrayObject->GetDataPtr(TRUE); - size_t num = pUserArrayObject->GetNumComponents(); - for (size_t i = 0; i < num; i ++) - { - callback(pUserObject, pObj[i], context); - } - } - } -} diff --git a/src/vm/gcenv.ee.h b/src/vm/gcenv.ee.h index e3867b7e98..b2ada36bcd 100644 --- a/src/vm/gcenv.ee.h +++ b/src/vm/gcenv.ee.h @@ -60,8 +60,6 @@ public: bool IsGCThread(); bool WasCurrentThreadCreatedByGC(); bool CreateThread(void (*threadStart)(void*), void* arg, bool is_suspendable, const char* name); - void WalkAsyncPinnedForPromotion(Object* object, ScanContext* sc, promote_func* callback); - void WalkAsyncPinned(Object* object, void* context, void(*callback)(Object*, Object*, void*)); }; } // namespace standalone diff --git a/src/vm/gcenv.ee.standalone.cpp b/src/vm/gcenv.ee.standalone.cpp index be8ceca0c1..5ba2aca812 100644 --- a/src/vm/gcenv.ee.standalone.cpp +++ b/src/vm/gcenv.ee.standalone.cpp @@ -6,7 +6,6 @@ #include "gcenv.h" #include "gcenv.ee.h" #include "threadsuspend.h" -#include "nativeoverlapped.h" #ifdef FEATURE_COMINTEROP #include "runtimecallablewrapper.h" @@ -28,4 +27,4 @@ namespace standalone #include "gcenv.ee.cpp" -} // namespace standalone +} // namespace standalone
\ No newline at end of file diff --git a/src/vm/gcenv.ee.static.cpp b/src/vm/gcenv.ee.static.cpp index 975decadf4..240e325a9e 100644 --- a/src/vm/gcenv.ee.static.cpp +++ b/src/vm/gcenv.ee.static.cpp @@ -6,7 +6,6 @@ #include "gcenv.h" #include "../gc/env/gcenv.ee.h" #include "threadsuspend.h" -#include "nativeoverlapped.h" #ifdef FEATURE_COMINTEROP #include "runtimecallablewrapper.h" @@ -23,4 +22,4 @@ extern MethodTable* pWeakReferenceOfTCanonMT; // Finalizes a weak reference directly. extern void FinalizeWeakReference(Object* obj); -#include "gcenv.ee.cpp" +#include "gcenv.ee.cpp"
\ No newline at end of file |