{
assert (size >= free_object_base_size);
- assert (g_pFreeObjectMethodTable->GetBaseSize() == free_object_base_size);
- assert (g_pFreeObjectMethodTable->RawGetComponentSize() == 1);
+ assert (g_gc_pFreeObjectMethodTable->GetBaseSize() == free_object_base_size);
+ assert (g_gc_pFreeObjectMethodTable->RawGetComponentSize() == 1);
- RawSetMethodTable( g_pFreeObjectMethodTable );
+ RawSetMethodTable( g_gc_pFreeObjectMethodTable );
size_t* numComponentsPtr = (size_t*) &((uint8_t*) this)[ArrayBase::GetOffsetOfNumComponents()];
*numComponentsPtr = size - free_object_base_size;
BOOL IsFree () const
{
- return (GetMethodTable() == g_pFreeObjectMethodTable);
+ return (GetMethodTable() == g_gc_pFreeObjectMethodTable);
}
#ifdef FEATURE_STRUCTALIGN
{
while (o < heap_segment_allocated (seg) && !marked (o))
{
- dprintf (1235, ("%Ix(%Id) F (%d)", o, AlignQword (size (o)), ((method_table (o) == g_pFreeObjectMethodTable) ? 1 : 0)));
+ dprintf (1235, ("%Ix(%Id) F (%d)", o, AlignQword (size (o)), ((method_table (o) == g_gc_pFreeObjectMethodTable) ? 1 : 0)));
o = o + AlignQword (size (o));
}
}
while (o < end)
{
- if (method_table(o) == g_pFreeObjectMethodTable)
+ if (method_table(o) == g_gc_pFreeObjectMethodTable)
{
o += Align (size (o), align_const);
continue;
uint8_t* plug_start = o;
- while (method_table(o) != g_pFreeObjectMethodTable)
+ while (method_table(o) != g_gc_pFreeObjectMethodTable)
{
o += Align (size (o), align_const);
if (o >= end)
seg = start_seg;
prev_seg = 0;
o = generation_allocation_start (gen);
- assert (method_table (o) == g_pFreeObjectMethodTable);
+ assert (method_table (o) == g_gc_pFreeObjectMethodTable);
align_const = get_alignment_constant (FALSE);
o = o + Align(size (o), align_const);
plug_end = o;
//dprintf (3, ("VOM: verifying member %Ix in obj %Ix", (size_t)*oo, o));
MethodTable *pMT = method_table (*oo);
- if (pMT == g_pFreeObjectMethodTable)
+ if (pMT == g_gc_pFreeObjectMethodTable)
{
free_ref_p = TRUE;
FATAL_GC_ERROR();
}
}
- if (*((uint8_t**)curr_object) != (uint8_t *) g_pFreeObjectMethodTable)
+ if (*((uint8_t**)curr_object) != (uint8_t *) g_gc_pFreeObjectMethodTable)
{
#ifdef FEATURE_LOH_COMPACTION
if ((curr_gen_num == (max_generation+1)) && (prev_object != 0))
{
- assert (method_table (prev_object) == g_pFreeObjectMethodTable);
+ assert (method_table (prev_object) == g_gc_pFreeObjectMethodTable);
}
#endif //FEATURE_LOH_COMPACTION
return E_FAIL;
}
+ g_gc_pFreeObjectMethodTable = GCToEEInterface::GetFreeObjectMethodTable();
+
//Initialize the static members.
#ifdef TRACE_GC
GcDuration = 0;
// the EE can opt to elevate that collection to be a blocking GC and not a background one.
virtual
bool ForceFullGCToBeBlocking() = 0;
+
+ // Retrieves the method table for the free object, a special kind of object used by the GC
+ // to keep the heap traversable. Conceptually, the free object is similar to a managed array
+ // of bytes: it consists of an object header (like all objects) and a "numComponents" field,
+ // followed by some number of bytes of space that's free on the heap.
+ //
+ // The free object allows the GC to traverse the heap because it can inspect the numComponents
+ // field to see how many bytes to skip before the next object on a heap segment begins.
+ virtual
+ MethodTable* GetFreeObjectMethodTable() = 0;
};
#endif // _GCINTERFACE_EE_H_