Skip to content

Commit e4dc001

Browse files
Aidan63Aidan Lee
andauthored
size_t for gc globals (#1393)
* size_t for gc globals * Remove commented out log referring to now non existing global --------- Co-authored-by: Aidan Lee <aidan.lee@evcam.com>
1 parent ceb70d0 commit e4dc001

3 files changed

Lines changed: 38 additions & 37 deletions

File tree

‎include/hx/GC.h‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,13 @@ extern std::atomic_uint gPauseForCollect;
159159

160160

161161
// Minimum total memory - used + buffer for new objects
162-
extern int sgMinimumWorkingMemory;
162+
extern size_t sgMinimumWorkingMemory;
163163

164164
// Minimum free memory - not counting used memory
165-
extern int sgMinimumFreeSpace;
165+
extern size_t sgMinimumFreeSpace;
166166

167167
// Also ensure that the free memory is larger than this amount of used memory
168-
extern int sgTargetFreeSpacePercentage;
168+
extern size_t sgTargetFreeSpacePercentage;
169169

170170

171171
extern HXCPP_EXTERN_CLASS_ATTRIBUTES int gByteMarkID;

‎src/hx/gc/GcCommon.cpp‎

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ extern void __hxt_new_string(void* result, int size);
2727
namespace hx
2828
{
2929
#if defined(HX_MACOS) || defined(HX_WINDOWS) || defined(HX_LINUX) || defined(__ORBIS__)
30-
int sgMinimumWorkingMemory = 20*1024*1024;
31-
int sgMinimumFreeSpace = 10*1024*1024;
30+
size_t sgMinimumWorkingMemory = 20*1024*1024;
31+
size_t sgMinimumFreeSpace = 10*1024*1024;
3232
#else
33-
int sgMinimumWorkingMemory = 8*1024*1024;
34-
int sgMinimumFreeSpace = 4*1024*1024;
33+
size_t sgMinimumWorkingMemory = 8*1024*1024;
34+
size_t sgMinimumFreeSpace = 4*1024*1024;
3535
#endif
3636
// Once you use more than the minimum, this kicks in...
37-
int sgTargetFreeSpacePercentage = 100;
37+
size_t sgTargetFreeSpacePercentage = 100;
3838

3939

4040

@@ -44,30 +44,36 @@ int sgTargetFreeSpacePercentage = 100;
4444
// Called internally before and GC operations
4545
void CommonInitAlloc()
4646
{
47+
// It is probably safe to use something like strtoull for parsing the size_t values as I'm sure every reasonable implementation treats them as uint64_t.
48+
// But just to be pedantic let's use sscanf which is the only "official" way to do this in C++11.
49+
// C++17 gives us std::charconv but I haven't twisted enough arms yet to have 17 be the minimum version.
50+
4751
#if !defined(HX_WINRT) && !defined(__SNC__) && !defined(__ORBIS__)
48-
const char *minimumWorking = getenv("HXCPP_MINIMUM_WORKING_MEMORY");
52+
const char *minimumWorking{ getenv("HXCPP_MINIMUM_WORKING_MEMORY") };
4953
if (minimumWorking)
5054
{
51-
int mem = atoi(minimumWorking);
52-
if (mem>0)
53-
sgMinimumWorkingMemory = mem;
55+
if (1 != std::sscanf(minimumWorking, "%zu", &sgMinimumWorkingMemory))
56+
{
57+
hx::CriticalError(HX_CSTRING("Failed to parse number from HXCPP_MINIMUM_WORKING_MEMORY environment variable"));
58+
}
5459
}
5560

56-
const char *minimumFreeSpace = getenv("HXCPP_MINIMUM_FREE_SPACE");
61+
const char* minimumFreeSpace{ getenv("HXCPP_MINIMUM_FREE_SPACE") };
5762
if (minimumFreeSpace)
5863
{
59-
int mem = atoi(minimumFreeSpace);
60-
if (mem>0)
61-
sgMinimumFreeSpace = mem;
64+
if (1 != std::sscanf(minimumFreeSpace, "%zu", &sgMinimumFreeSpace))
65+
{
66+
hx::CriticalError(HX_CSTRING("Failed to parse number from HXCPP_MINIMUM_FREE_SPACE environment variable"));
67+
}
6268
}
6369

64-
65-
const char *targetFree = getenv("HXCPP_TARGET_FREE_SPACE");
70+
const char* targetFree{ getenv("HXCPP_TARGET_FREE_SPACE") };
6671
if (targetFree)
6772
{
68-
int percent = atoi(targetFree);
69-
if (percent>0)
70-
sgTargetFreeSpacePercentage = percent;
73+
if (1 != std::sscanf(targetFree, "%zu", &sgTargetFreeSpacePercentage))
74+
{
75+
hx::CriticalError(HX_CSTRING("Failed to parse number from HXCPP_TARGET_FREE_SPACE environment variable"));
76+
}
7177
}
7278
#endif
7379
}

‎src/hx/gc/Immix.cpp‎

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ void DebuggerTrap()
9797

9898
static bool sgAllocInit = 0;
9999
static bool sgInternalEnable = true;
100-
static void *sgObject_root = 0;
101100
// With virtual inheritance, stack pointers can point to the middle of an object
102101
#ifdef _MSC_VER
103102
// MSVC optimizes by taking the address of an initernal data member
@@ -5126,13 +5125,13 @@ class GlobalAllocator
51265125
else
51275126
{
51285127
size_t mem = mRowsInUse<<IMMIX_LINE_BITS;
5129-
size_t targetFree = std::max((size_t)hx::sgMinimumFreeSpace, mem/100 * (size_t)hx::sgTargetFreeSpacePercentage );
5130-
targetFree = std::min(targetFree, (size_t)sgMaximumFreeSpace );
5131-
sWorkingMemorySize = std::max( mem + targetFree, (size_t)hx::sgMinimumWorkingMemory);
5128+
size_t targetFree = std::max(hx::sgMinimumFreeSpace, mem / 100 * hx::sgTargetFreeSpacePercentage );
5129+
targetFree = std::min(targetFree, sgMaximumFreeSpace );
5130+
sWorkingMemorySize = std::max( mem + targetFree, hx::sgMinimumWorkingMemory);
51325131

51335132
size_t allMem = GetWorkingMemory();
51345133
// 8 Meg too much?
5135-
size_t allowExtra = std::max( (size_t)8*1024*1024, sWorkingMemorySize*5/4 );
5134+
size_t allowExtra = std::max(size_t{ 8 } * 1024 * 1024, sWorkingMemorySize * 5 / 4);
51365135

51375136
if ( allMem > sWorkingMemorySize + allowExtra )
51385137
{
@@ -5176,9 +5175,9 @@ class GlobalAllocator
51765175
if (doRelease)
51775176
{
51785177
size_t mem = mRowsInUse<<IMMIX_LINE_BITS;
5179-
size_t targetFree = std::max((size_t)hx::sgMinimumFreeSpace, bytesInUse/100 *hx::sgTargetFreeSpacePercentage );
5180-
targetFree = std::min(targetFree, (size_t)sgMaximumFreeSpace );
5181-
size_t targetMem = std::max( mem + targetFree, (size_t)hx::sgMinimumWorkingMemory) +
5178+
size_t targetFree = std::max(hx::sgMinimumFreeSpace, bytesInUse/100 *hx::sgTargetFreeSpacePercentage );
5179+
targetFree = std::min(targetFree, sgMaximumFreeSpace );
5180+
size_t targetMem = std::max( mem + targetFree, hx::sgMinimumWorkingMemory) +
51825181
(2<<(IMMIX_BLOCK_GROUP_BITS+IMMIX_BLOCK_BITS));
51835182

51845183
if (inForceCompact)
@@ -5225,14 +5224,14 @@ class GlobalAllocator
52255224
size_t mem = mRowsInUse<<IMMIX_LINE_BITS;
52265225
size_t baseMem = full ? bytesInUse : mem;
52275226
#ifdef HXCPP_GC_DYNAMIC_SIZE
5228-
size_t targetFree = std::max((size_t)hx::sgMinimumFreeSpace, (size_t)(baseMem * profileCollectSummary.spaceFactor ) );
5227+
size_t targetFree = std::max(hx::sgMinimumFreeSpace, baseMem * profileCollectSummary.spaceFactor );
52295228
#else
5230-
size_t targetFree = std::max((size_t)hx::sgMinimumFreeSpace, baseMem/100 *hx::sgTargetFreeSpacePercentage );
5229+
size_t targetFree = std::max(hx::sgMinimumFreeSpace, baseMem / 100 *hx::sgTargetFreeSpacePercentage );
52315230
#endif
5232-
targetFree = std::min(targetFree, (size_t)sgMaximumFreeSpace );
5231+
targetFree = std::min(targetFree, sgMaximumFreeSpace );
52335232
// Only adjust if non-generational
52345233
if (!generational)
5235-
sWorkingMemorySize = std::max( mem + targetFree, (size_t)hx::sgMinimumWorkingMemory);
5234+
sWorkingMemorySize = std::max( mem + targetFree, hx::sgMinimumWorkingMemory);
52365235

52375236
#if defined(SHOW_FRAGMENTATION) || defined(SHOW_MEM_EVENTS)
52385237
GCLOG("Target memory %s, using %s\n", formatBytes(sWorkingMemorySize).c_str(), formatBytes(mem).c_str() );
@@ -6556,11 +6555,7 @@ void InitAlloc()
65566555
sgFinalizers = new FinalizerList();
65576556
sFinalizerLock = new std::mutex();
65586557
sGCRootLock = new std::mutex();
6559-
hx::Object tmp;
6560-
void **stack = *(void ***)(&tmp);
6561-
sgObject_root = stack[0];
65626558

6563-
//GCLOG("__root pointer %p\n", sgObject_root);
65646559
gMainThreadContext = new LocalAllocator();
65656560

65666561
tlsStackContext = gMainThreadContext;

0 commit comments

Comments
 (0)