}
#if PROFILING_SUPPORTED
-void Module::UpdateNewlyAddedTypes()
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- INJECT_FAULT(COMPlusThrowOM(););
- }
- CONTRACTL_END
-
- DWORD countTypesAfterProfilerUpdate = GetMDImport()->GetCountWithTokenKind(mdtTypeDef);
- DWORD countExportedTypesAfterProfilerUpdate = GetMDImport()->GetCountWithTokenKind(mdtExportedType);
-
- // typeDefs rids 0 and 1 aren't included in the count, thus X typeDefs before means rid X+1 was valid and our incremental addition should start at X+2
- for (DWORD typeDefRid = m_dwTypeCount + 2; typeDefRid < countTypesAfterProfilerUpdate + 2; typeDefRid++)
- {
- GetAssembly()->AddType(this, TokenFromRid(typeDefRid, mdtTypeDef));
- }
-
- // exportedType rid 0 isn't included in the count, thus X exportedTypes before means rid X was valid and our incremental addition should start at X+1
- for (DWORD exportedTypeDef = m_dwExportedTypeCount + 1; exportedTypeDef < countExportedTypesAfterProfilerUpdate + 1; exportedTypeDef++)
- {
- GetAssembly()->AddExportedType(TokenFromRid(exportedTypeDef, mdtExportedType));
- }
-
- m_dwTypeCount = countTypesAfterProfilerUpdate;
- m_dwExportedTypeCount = countExportedTypesAfterProfilerUpdate;
-}
-
void Module::NotifyProfilerLoadFinished(HRESULT hr)
{
CONTRACTL
if (SetTransientFlagInterlocked(IS_PROFILER_NOTIFIED))
{
// Record how many types are already present
+ DWORD countTypesOrig = 0;
+ DWORD countExportedTypesOrig = 0;
if (!IsResource())
{
- m_dwTypeCount = GetMDImport()->GetCountWithTokenKind(mdtTypeDef);
- m_dwExportedTypeCount = GetMDImport()->GetCountWithTokenKind(mdtExportedType);
+ countTypesOrig = GetMDImport()->GetCountWithTokenKind(mdtTypeDef);
+ countExportedTypesOrig = GetMDImport()->GetCountWithTokenKind(mdtExportedType);
}
// Notify the profiler, this may cause metadata to be updated
// assembly
if (!IsResource())
{
- UpdateNewlyAddedTypes();
+ DWORD countTypesAfterProfilerUpdate = GetMDImport()->GetCountWithTokenKind(mdtTypeDef);
+ DWORD countExportedTypesAfterProfilerUpdate = GetMDImport()->GetCountWithTokenKind(mdtExportedType);
+ // typeDefs rids 0 and 1 aren't included in the count, thus X typeDefs before means rid X+1 was valid and our incremental addition should start at X+2
+ for (DWORD typeDefRid = countTypesOrig + 2; typeDefRid < countTypesAfterProfilerUpdate + 2; typeDefRid++)
+ {
+ GetAssembly()->AddType(this, TokenFromRid(typeDefRid, mdtTypeDef));
+ }
+ // exportedType rid 0 isn't included in the count, thus X exportedTypes before means rid X was valid and our incremental addition should start at X+1
+ for (DWORD exportedTypeDef = countExportedTypesOrig + 1; exportedTypeDef < countExportedTypesAfterProfilerUpdate + 1; exportedTypeDef++)
+ {
+ GetAssembly()->AddExportedType(TokenFromRid(exportedTypeDef, mdtExportedType));
+ }
}
{
m_ModuleID = NULL;
m_ModuleIndex.m_dwIndex = (SIZE_T)-1;
- // These will be initialized in NotifyProfilerLoadFinished, set them to
- // a safe initial value now.
- m_dwTypeCount = 0;
- m_dwExportedTypeCount = 0;
-
// Prepare statics that are known at module load time
AllocateStatics(pamTracker);
CONTRACTL
{
THROWS;
- GC_TRIGGERS;
+ GC_NOTRIGGER;
MODE_ANY;
}
CONTRACTL_END;
HRESULT hr = S_OK;
ULONG ulCount;
-#if PROFILING_SUPPORTED
- if (!IsResource())
- {
- UpdateNewlyAddedTypes();
- }
-#endif // PROFILING_SUPPORTED
-
// Ensure for TypeRef
ulCount = GetMDImport()->GetCountWithTokenKind(mdtTypeRef) + 1;
EnsureTypeRefCanBeStored(TokenFromRid(ulCount, mdtTypeRef));
// Ensure for AssemblyRef
ulCount = GetMDImport()->GetCountWithTokenKind(mdtAssemblyRef) + 1;
EnsureAssemblyRefCanBeStored(TokenFromRid(ulCount, mdtAssemblyRef));
-
- // Ensure for MethodDef
- ulCount = GetMDImport()->GetCountWithTokenKind(mdtMethodDef) + 1;
- EnsureMethodDefCanBeStored(TokenFromRid(ulCount, mdtMethodDef));
}
//
BOOL m_nativeImageProfiling;
CORCOMPILE_METHOD_PROFILE_LIST *m_methodProfileList;
-#if PROFILING_SUPPORTED_DATA
- DWORD m_dwTypeCount;
- DWORD m_dwExportedTypeCount;
-#endif // PROFILING_SUPPORTED_DATA
-
#if defined(FEATURE_COMINTEROP)
public:
DEBUGGER_INFO_SHIFT_PRIV);
}
- void UpdateNewlyAddedTypes();
-
#ifdef PROFILING_SUPPORTED
BOOL IsProfilerNotified() {LIMITED_METHOD_CONTRACT; return (m_dwTransientFlags & IS_PROFILER_NOTIFIED) != 0; }
void NotifyProfilerLoadFinished(HRESULT hr);
continue;
#ifdef FEATURE_READYTORUN
- if (nhTable == nhCaseSensitive && pCurrentClsModule->IsReadyToRun() && pCurrentClsModule->GetReadyToRunInfo()->HasHashtableOfTypes() &&
- pCurrentClsModule->GetAvailableClassHash() == NULL)
+ if (nhTable == nhCaseSensitive && pCurrentClsModule->IsReadyToRun() && pCurrentClsModule->GetReadyToRunInfo()->HasHashtableOfTypes())
{
// For R2R modules, we only search the hashtable of token types stored in the module's image, and don't fallback
// to searching m_pAvailableClasses or m_pAvailableClassesCaseIns (in fact, we don't even allocate them for R2R modules).
#endif
CrstHolder ch(&m_AvailableClassLock);
-
- // R2R pre-computes an export table and tries to avoid populating a class hash at runtime. However the profiler can
- // still add new types on the fly by calling here. If that occurs we fallback to the slower path of creating the
- // in memory hashtable as usual.
- if (!pModule->IsResource() && pModule->GetAvailableClassHash() == NULL)
- {
- LazyPopulateCaseSensitiveHashTables();
- }
-
AddAvailableClassHaveLock(
pModule,
classdef,
CONTRACTL_END
CrstHolder ch(&m_AvailableClassLock);
-
- // R2R pre-computes an export table and tries to avoid populating a class hash at runtime. However the profiler can
- // still add new types on the fly by calling here. If that occurs we fallback to the slower path of creating the
- // in memory hashtable as usual.
- if (!pManifestModule->IsResource() && pManifestModule->GetAvailableClassHash() == NULL)
- {
- LazyPopulateCaseSensitiveHashTables();
- }
-
AddExportedTypeHaveLock(
pManifestModule,
cl,