|
|
@@ -3,16 +3,17 @@
|
|
|
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
|
|
//-------------------------------------------------------------------------------------------------------
|
|
|
#include "CommonMemoryPch.h"
|
|
|
-#include "Memory\PageHeapBlockTypeFilter.h"
|
|
|
+#include "Memory/PageHeapBlockTypeFilter.h"
|
|
|
#if defined(_M_IX86_OR_ARM32)
|
|
|
-#include "ValidPointersMap\vpm.32b.h"
|
|
|
+#include "ValidPointersMap/vpm.32b.h"
|
|
|
#elif defined(_M_X64_OR_ARM64)
|
|
|
-#include "ValidPointersMap\vpm.64b.h"
|
|
|
+#include "ValidPointersMap/vpm.64b.h"
|
|
|
#else
|
|
|
#error "Platform is not handled"
|
|
|
#endif
|
|
|
|
|
|
-template __forceinline char* HeapInfo::RealAlloc<NoBit, false>(Recycler * recycler, size_t sizeCat);
|
|
|
+template <>
|
|
|
+__forceinline char* HeapInfo::RealAlloc<NoBit, false>(Recycler * recycler, size_t sizeCat);
|
|
|
|
|
|
HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes> HeapInfo::smallAllocValidPointersMap;
|
|
|
HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes> HeapInfo::mediumAllocValidPointersMap;
|
|
|
@@ -82,7 +83,7 @@ void HeapInfo::ValidPointersMap<TBlockAttributes>::GenerateValidPointersMap(Vali
|
|
|
ushort * validPointers = buffer;
|
|
|
buffer += TBlockAttributes::MaxSmallObjectCount;
|
|
|
|
|
|
- SmallHeapBlockT<TBlockAttributes>::SmallHeapBlockBitVector * invalidBitVector = &invalidTable[i];
|
|
|
+ typename SmallHeapBlockT<TBlockAttributes>::SmallHeapBlockBitVector * invalidBitVector = &invalidTable[i];
|
|
|
invalidBitVector->SetAll();
|
|
|
|
|
|
uint bucketSize;
|
|
|
@@ -153,74 +154,74 @@ HRESULT HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::GenerateVali
|
|
|
}
|
|
|
GenerateValidPointersMap(*valid, *invalid, *blockMap);
|
|
|
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"const ushort HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::rowSize] = \n{\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("const ushort HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::validPointersBuffer[HeapConstants::BucketCount][HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::rowSize] = \n{\n")));
|
|
|
// Generate the full buffer.
|
|
|
for (unsigned i = 0; i < HeapConstants::BucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n ")));
|
|
|
for (unsigned j = 0; j < rowSize; ++j)
|
|
|
{
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- (j < rowSize - 1) ? L"0x%04hX, " : L"0x%04hX",
|
|
|
+ (j < rowSize - 1) ? CH_WSTR("0x%04hX, ") : CH_WSTR("0x%04hX"),
|
|
|
(*valid)[i][j]));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"};\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("};\n")));
|
|
|
|
|
|
// Generate the invalid bitvectors.
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"const BVUnit HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsData[HeapConstants::BucketCount][SmallHeapBlockT<SmallAllocationBlockAttributes>::SmallHeapBlockBitVector::wordCount] = {\n"));
|
|
|
+ CH_WSTR("const BVUnit HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsData[HeapConstants::BucketCount][SmallHeapBlockT<SmallAllocationBlockAttributes>::SmallHeapBlockBitVector::wordCount] = {\n")));
|
|
|
for (unsigned i = 0; i < HeapConstants::BucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n ")));
|
|
|
|
|
|
for (unsigned j = 0; j < (*invalid)[i].wordCount; ++j)
|
|
|
{
|
|
|
- const wchar_t *format = (j < (*invalid)[i].wordCount - 1) ?
|
|
|
+ const wchar16 *format = (j < (*invalid)[i].wordCount - 1) ?
|
|
|
#if defined(_M_IX86_OR_ARM32)
|
|
|
- L"0x%08X, " : L"0x%08X"
|
|
|
+ CH_WSTR("0x%08X, ") : CH_WSTR("0x%08X")
|
|
|
#elif defined(_M_X64_OR_ARM64)
|
|
|
- L"0x%016I64X, " : L"0x%016I64X"
|
|
|
+ CH_WSTR("0x%016I64X, ") : CH_WSTR("0x%016I64X")
|
|
|
#else
|
|
|
#error "Platform is not handled"
|
|
|
#endif
|
|
|
;
|
|
|
IfErrorGotoCleanup(fwprintf(file, format, (*invalid)[i].GetRawData()[j]));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"};\n"
|
|
|
- L"// The following is used to construct the InvalidBitsTable statically without forcing BVStatic to be an aggregate\n"
|
|
|
- L"const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::InvalidBitsTable * const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsBuffers =\n"
|
|
|
- L" reinterpret_cast<const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::InvalidBitsTable *>(&HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsData);\n"));
|
|
|
+ CH_WSTR("};\n")
|
|
|
+ CH_WSTR("// The following is used to construct the InvalidBitsTable statically without forcing BVStatic to be an aggregate\n")
|
|
|
+ CH_WSTR("const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::InvalidBitsTable * const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsBuffers =\n")
|
|
|
+ CH_WSTR(" reinterpret_cast<const HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::InvalidBitsTable *>(&HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::invalidBitsData);\n")));
|
|
|
|
|
|
// Generate the block map table
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"const SmallHeapBlockT<SmallAllocationBlockAttributes>::BlockInfo HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::blockInfoBuffer[SmallAllocationBlockAttributes::BucketCount][SmallAllocationBlockAttributes::PageCount] = {\n"));
|
|
|
+ CH_WSTR("const SmallHeapBlockT<SmallAllocationBlockAttributes>::BlockInfo HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>::blockInfoBuffer[SmallAllocationBlockAttributes::BucketCount][SmallAllocationBlockAttributes::PageCount] = {\n")));
|
|
|
for (unsigned i = 0; i < HeapConstants::BucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" // Bucket: %u, Size: %d\n", i, (int) (HeapConstants::ObjectGranularity + (i * SmallAllocationBlockAttributes::BucketGranularity))));
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" // Bucket: %u, Size: %d\n"), i, (int) (HeapConstants::ObjectGranularity + (i * SmallAllocationBlockAttributes::BucketGranularity))));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n")));
|
|
|
|
|
|
for (unsigned j = 0; j < SmallAllocationBlockAttributes::PageCount; ++j)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" { "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" { ")));
|
|
|
|
|
|
- const wchar_t *format = L"0x%04hX, 0x%04hX";
|
|
|
+ const wchar16 *format = CH_WSTR("0x%04hX, 0x%04hX");
|
|
|
IfErrorGotoCleanup(fwprintf(file, format, (*blockMap)[i][j].lastObjectIndexOnPage, (*blockMap)[i][j].pageObjectCount));
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (j < SmallAllocationBlockAttributes::PageCount - 1 ? L" },\n" : L" }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (j < SmallAllocationBlockAttributes::PageCount - 1 ? CH_WSTR(" },\n") : CH_WSTR(" }\n"))));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::BucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"};\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("};\n")));
|
|
|
|
|
|
cleanup:
|
|
|
#undef IfErrorGotoCleanup
|
|
|
@@ -250,74 +251,74 @@ HRESULT HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::GenerateVal
|
|
|
}
|
|
|
GenerateValidPointersMap(*valid, *invalid, *blockMap);
|
|
|
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"const ushort HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::rowSize] = \n{\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("const ushort HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::validPointersBuffer[MediumAllocationBlockAttributes::BucketCount][HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::rowSize] = \n{\n")));
|
|
|
// Generate the full buffer.
|
|
|
for (unsigned i = 0; i < HeapConstants::MediumBucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n ")));
|
|
|
for (unsigned j = 0; j < rowSize; ++j)
|
|
|
{
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- (j < rowSize - 1) ? L"0x%04hX, " : L"0x%04hX",
|
|
|
+ (j < rowSize - 1) ? CH_WSTR("0x%04hX, ") : CH_WSTR("0x%04hX"),
|
|
|
(*valid)[i][j]));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"};\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("};\n")));
|
|
|
|
|
|
// Generate the invalid bitvectors.
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"const BVUnit HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsData[MediumAllocationBlockAttributes::BucketCount][SmallHeapBlockT<MediumAllocationBlockAttributes>::SmallHeapBlockBitVector::wordCount] = {\n"));
|
|
|
+ CH_WSTR("const BVUnit HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsData[MediumAllocationBlockAttributes::BucketCount][SmallHeapBlockT<MediumAllocationBlockAttributes>::SmallHeapBlockBitVector::wordCount] = {\n")));
|
|
|
for (unsigned i = 0; i < HeapConstants::MediumBucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n ")));
|
|
|
|
|
|
for (unsigned j = 0; j < (*invalid)[i].wordCount; ++j)
|
|
|
{
|
|
|
- const wchar_t *format = (j < (*invalid)[i].wordCount - 1) ?
|
|
|
+ const wchar16 *format = (j < (*invalid)[i].wordCount - 1) ?
|
|
|
#if defined(_M_IX86_OR_ARM32)
|
|
|
- L"0x%08X, " : L"0x%08X"
|
|
|
+ CH_WSTR("0x%08X, ") : CH_WSTR("0x%08X")
|
|
|
#elif defined(_M_X64_OR_ARM64)
|
|
|
- L"0x%016I64X, " : L"0x%016I64X"
|
|
|
+ CH_WSTR("0x%016I64X, ") : CH_WSTR("0x%016I64X")
|
|
|
#else
|
|
|
#error "Platform is not handled"
|
|
|
#endif
|
|
|
;
|
|
|
IfErrorGotoCleanup(fwprintf(file, format, (*invalid)[i].GetRawData()[j]));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"};\n"
|
|
|
- L"// The following is used to construct the InvalidBitsTable statically without forcing BVStatic to be an aggregate\n"
|
|
|
- L"const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::InvalidBitsTable * const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsBuffers =\n"
|
|
|
- L" reinterpret_cast<const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::InvalidBitsTable *>(&HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsData);\n"));
|
|
|
+ CH_WSTR("};\n")
|
|
|
+ CH_WSTR("// The following is used to construct the InvalidBitsTable statically without forcing BVStatic to be an aggregate\n")
|
|
|
+ CH_WSTR("const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::InvalidBitsTable * const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsBuffers =\n")
|
|
|
+ CH_WSTR(" reinterpret_cast<const HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::InvalidBitsTable *>(&HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::invalidBitsData);\n")));
|
|
|
|
|
|
// Generate the block map table
|
|
|
IfErrorGotoCleanup(fwprintf(
|
|
|
file,
|
|
|
- L"const SmallHeapBlockT<MediumAllocationBlockAttributes>::BlockInfo HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::blockInfoBuffer[MediumAllocationBlockAttributes::BucketCount][MediumAllocationBlockAttributes::PageCount] = {\n"));
|
|
|
+ CH_WSTR("const SmallHeapBlockT<MediumAllocationBlockAttributes>::BlockInfo HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>::blockInfoBuffer[MediumAllocationBlockAttributes::BucketCount][MediumAllocationBlockAttributes::PageCount] = {\n")));
|
|
|
|
|
|
for (unsigned i = 0; i < HeapConstants::MediumBucketCount; ++i)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" // Bucket: %u, Size: %d\n", i, (int)(HeapConstants::MaxSmallObjectSize + ((i + 1) * MediumAllocationBlockAttributes::BucketGranularity))));
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" {\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" // Bucket: %u, Size: %d\n"), i, (int)(HeapConstants::MaxSmallObjectSize + ((i + 1) * MediumAllocationBlockAttributes::BucketGranularity))));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" {\n")));
|
|
|
|
|
|
for (unsigned j = 0; j < MediumAllocationBlockAttributes::PageCount; ++j)
|
|
|
{
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L" { "));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR(" { ")));
|
|
|
|
|
|
- const wchar_t *format = L"0x%04hX, 0x%04hX";
|
|
|
+ const wchar16 *format = CH_WSTR("0x%04hX, 0x%04hX");
|
|
|
IfErrorGotoCleanup(fwprintf(file, format, (*blockMap)[i][j].lastObjectIndexOnPage, (*blockMap)[i][j].pageObjectCount));
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (j < MediumAllocationBlockAttributes::PageCount - 1 ? L" },\n" : L" }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (j < MediumAllocationBlockAttributes::PageCount - 1 ? CH_WSTR(" },\n") : CH_WSTR(" }\n"))));
|
|
|
}
|
|
|
- IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? L"\n },\n" : L"\n }\n")));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, (i < HeapConstants::MediumBucketCount - 1 ? CH_WSTR("\n },\n") : CH_WSTR("\n }\n"))));
|
|
|
}
|
|
|
|
|
|
- IfErrorGotoCleanup(fwprintf(file, L"};\n"));
|
|
|
+ IfErrorGotoCleanup(fwprintf(file, CH_WSTR("};\n")));
|
|
|
|
|
|
cleanup:
|
|
|
#undef IfErrorGotoCleanup
|
|
|
@@ -333,23 +334,23 @@ HRESULT HeapInfo::ValidPointersMap<TBlockAttributes>::GenerateValidPointersMapHe
|
|
|
HRESULT hr = E_FAIL;
|
|
|
FILE * file = nullptr;
|
|
|
|
|
|
- if (_wfopen_s(&file, vpmFullPath, L"w") == 0 && file != nullptr)
|
|
|
+ if (_wfopen_s(&file, vpmFullPath, CH_WSTR("w")) == 0 && file != nullptr)
|
|
|
{
|
|
|
- const wchar_t * header =
|
|
|
- L"//-------------------------------------------------------------------------------------------------------\n"
|
|
|
- L"// Copyright (C) Microsoft. All rights reserved.\n"
|
|
|
- L"// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.\n"
|
|
|
- L"//-------------------------------------------------------------------------------------------------------\n"
|
|
|
- L"// Generated via jshost -GenerateValidPointersMapHeader\n"
|
|
|
+ const wchar16 * header =
|
|
|
+ CH_WSTR("//-------------------------------------------------------------------------------------------------------\n")
|
|
|
+ CH_WSTR("// Copyright (C) Microsoft. All rights reserved.\n")
|
|
|
+ CH_WSTR("// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.\n")
|
|
|
+ CH_WSTR("//-------------------------------------------------------------------------------------------------------\n")
|
|
|
+ CH_WSTR("// Generated via jshost -GenerateValidPointersMapHeader\n")
|
|
|
#if defined(_M_IX86_OR_ARM32)
|
|
|
- L"// Target platforms: 32bit - x86 & arm\n"
|
|
|
+ CH_WSTR("// Target platforms: 32bit - x86 & arm\n")
|
|
|
#elif defined(_M_X64_OR_ARM64)
|
|
|
- L"// Target platform: 64bit - amd64 & arm64\n"
|
|
|
+ CH_WSTR("// Target platform: 64bit - amd64 & arm64\n")
|
|
|
#else
|
|
|
#error "Platform is not handled"
|
|
|
#endif
|
|
|
- L"#if USE_STATIC_VPM\n"
|
|
|
- L"\n";
|
|
|
+ CH_WSTR("#if USE_STATIC_VPM\n")
|
|
|
+ CH_WSTR("\n");
|
|
|
if (fwprintf(file, header) >= 0)
|
|
|
{
|
|
|
hr = ValidPointersMap<SmallAllocationBlockAttributes>::GenerateValidPointersMapForBlockType(file);
|
|
|
@@ -358,7 +359,7 @@ HRESULT HeapInfo::ValidPointersMap<TBlockAttributes>::GenerateValidPointersMapHe
|
|
|
hr = ValidPointersMap<MediumAllocationBlockAttributes>::GenerateValidPointersMapForBlockType(file);
|
|
|
}
|
|
|
|
|
|
- fwprintf(file, L"#endif // USE_STATIC_VPM\n");
|
|
|
+ fwprintf(file, CH_WSTR("#endif // USE_STATIC_VPM\n"));
|
|
|
}
|
|
|
|
|
|
fclose(file);
|
|
|
@@ -1782,8 +1783,11 @@ BOOL MediumAllocationBlockAttributes::IsAlignedObjectSize(size_t sizeCat)
|
|
|
return HeapInfo::IsAlignedMediumObjectSize(sizeCat);
|
|
|
}
|
|
|
|
|
|
+namespace Memory
|
|
|
+{
|
|
|
template class HeapInfo::ValidPointersMap<SmallAllocationBlockAttributes>;
|
|
|
template class ValidPointers<SmallAllocationBlockAttributes>;
|
|
|
|
|
|
template class HeapInfo::ValidPointersMap<MediumAllocationBlockAttributes>;
|
|
|
template class ValidPointers<MediumAllocationBlockAttributes>;
|
|
|
+};
|