//
#include "gcpriv.h"
+#include "softwarewritewatch.h"
#define USE_INTROSORT
}
inline
+size_t align_write_watch_lower_page (size_t add)
+{
+ return (add & ~(WRITE_WATCH_UNIT_SIZE - 1));
+}
+
+inline
+uint8_t* align_write_watch_lower_page (uint8_t* add)
+{
+ return (uint8_t*)align_lower_page ((size_t)add);
+}
+
+
+inline
BOOL power_of_two_p (size_t integer)
{
return !(integer & (integer-1));
}
else
{
- if (((last_page + OS_PAGE_SIZE) == page)
+ if (((last_page + WRITE_WATCH_UNIT_SIZE) == page)
|| (start_address <= last_object))
{
o = last_object;
dprintf (3,("page %Ix start: %Ix, %Ix[ ",
(size_t)page, (size_t)o,
- (size_t)(min (high_address, page + OS_PAGE_SIZE))));
+ (size_t)(min (high_address, page + WRITE_WATCH_UNIT_SIZE))));
- while (o < (min (high_address, page + OS_PAGE_SIZE)))
+ while (o < (min (high_address, page + WRITE_WATCH_UNIT_SIZE)))
{
size_t s;
{
dprintf (3, ("going through %Ix", (size_t)o));
go_through_object (method_table(o), o, s, poo, start_address, use_start, (o + s),
- if ((uint8_t*)poo >= min (high_address, page + OS_PAGE_SIZE))
+ if ((uint8_t*)poo >= min (high_address, page + WRITE_WATCH_UNIT_SIZE))
{
no_more_loop_p = TRUE;
goto end_limit;
large_objects_p &&
#endif // !FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
((CObjectHeader*)o)->IsFree() &&
- (next_o > min (high_address, page + OS_PAGE_SIZE)))
+ (next_o > min (high_address, page + WRITE_WATCH_UNIT_SIZE)))
{
// We need to not skip the object here because of this corner scenario:
// A large object was being allocated during BGC mark so we first made it
#ifdef MULTIPLE_HEAPS
if (concurrent_p)
{
- assert (last_object < (min (high_address, page + OS_PAGE_SIZE)));
+ assert (last_object < (min (high_address, page + WRITE_WATCH_UNIT_SIZE)));
}
else
#endif //MULTIPLE_HEAPS
}
dprintf (3,("Last object: %Ix", (size_t)last_object));
- last_page = align_lower_page (o);
+ last_page = align_write_watch_lower_page (o);
}
// When reset_only_p is TRUE, we should only reset pages that are in range
}
if (bcount >= array_size){
- base_address = background_written_addresses [array_size-1] + OS_PAGE_SIZE;
+ base_address = background_written_addresses [array_size-1] + WRITE_WATCH_UNIT_SIZE;
bcount = array_size;
}
}
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
#ifndef DACCESS_COMPILE
-static_assert((static_cast<size_t>(1) << SOFTWARE_WRITE_WATCH_AddressToTableByteIndexShift) == OS_PAGE_SIZE, "Unexpected OS_PAGE_SIZE");
+static_assert((static_cast<size_t>(1) << SOFTWARE_WRITE_WATCH_AddressToTableByteIndexShift) == WRITE_WATCH_UNIT_SIZE, "Unexpected WRITE_WATCH_UNIT_SIZE");
extern "C"
{
block[byteIndex] = 0;
}
- void *pageAddress = firstPageAddressInBlock + byteIndex * OS_PAGE_SIZE;
+ void *pageAddress = firstPageAddressInBlock + byteIndex * WRITE_WATCH_UNIT_SIZE;
assert(pageAddress >= GetHeapStartAddress());
assert(pageAddress < GetHeapEndAddress());
assert(dirtyPageIndex < dirtyPageCount);
break;
}
currentBlock += sizeof(size_t);
- firstPageAddressInCurrentBlock += sizeof(size_t) * OS_PAGE_SIZE;
+ firstPageAddressInCurrentBlock += sizeof(size_t) * WRITE_WATCH_UNIT_SIZE;
}
while (currentBlock < fullBlockEnd)
break;
}
currentBlock += sizeof(size_t);
- firstPageAddressInCurrentBlock += sizeof(size_t) * OS_PAGE_SIZE;
+ firstPageAddressInCurrentBlock += sizeof(size_t) * WRITE_WATCH_UNIT_SIZE;
}
if (currentBlock < fullBlockEnd)
{