[pypy-commit] stmgc c7-refactor: More prebuilt stuff from two days ago. Might get changed soon.
arigo
noreply at buildbot.pypy.org
Fri Feb 14 14:22:27 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: c7-refactor
Changeset: r728:f1f127c63039
Date: 2014-02-13 13:49 +0100
http://bitbucket.org/pypy/stmgc/changeset/f1f127c63039/
Log: More prebuilt stuff from two days ago. Might get changed soon.
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -30,6 +30,7 @@
perror("madvise");
abort();
}
+ reset_transaction_read_version_prebuilt();
STM_SEGMENT->transaction_read_version = 1;
}
diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -12,9 +12,9 @@
object_t *_stm_allocate_old(ssize_t size_rounded_up)
{
char *addr = large_malloc(size_rounded_up);
- memset(addr, 0, size_rounded_up);
+ object_t* o = (object_t *)(addr - stm_object_pages);
- object_t* o = (object_t *)(addr - stm_object_pages);
+ memset(REAL_ADDRESS(STM_SEGMENT->segment_base, o), 0, size_rounded_up);
o->stm_flags = GCFLAG_WRITE_BARRIER;
return o;
}
diff --git a/c7/stm/prebuilt.c b/c7/stm/prebuilt.c
--- a/c7/stm/prebuilt.c
+++ b/c7/stm/prebuilt.c
@@ -3,6 +3,11 @@
#endif
+static uint64_t prebuilt_readmarkers_start = 0;
+static uint64_t prebuilt_readmarkers_end = 0;
+static uint64_t prebuilt_objects_start = 0;
+
+
void stm_copy_prebuilt_objects(object_t *target, char *source, ssize_t size)
{
/* Initialize a region of 'size' bytes at the 'target' address,
@@ -23,19 +28,51 @@
with STM_FLAGS_PREBUILT.
*/
- uintptr_t utarget = (uintptr_t)target;
- if (utarget / 16 < 8192 ||
- utarget + size > FIRST_READMARKER_PAGE * 4096UL ||
- (utarget + size + 15) / 16 > utarget) {
+ uint64_t utarget = (uint64_t)target;
+ uint64_t rm_start = utarget / 16;
+ uint64_t rm_end = (utarget + size + 15) / 16;
+
+ if (rm_start < 8192 || rm_end > (utarget & ~4095) ||
+ utarget + size > FIRST_READMARKER_PAGE * 4096UL) {
fprintf(stderr,
- "stm_copy_prebuilt_objects: invalid range (%ld, %ld)",
+ "stm_copy_prebuilt_objects: invalid range (0x%lx, 0x%lx)\n",
(long)utarget, (long)size);
abort();
}
- uintptr_t start_page = utarget / 4096;
- uintptr_t end_page = (utarget + size + 4095) / 4096;
+
+ if (prebuilt_readmarkers_start == 0) {
+ prebuilt_readmarkers_start = rm_start;
+ prebuilt_readmarkers_end = rm_end;
+ prebuilt_objects_start = utarget & ~4095;
+ }
+ else {
+ if (prebuilt_readmarkers_start > rm_start)
+ prebuilt_readmarkers_start = rm_start;
+ if (prebuilt_readmarkers_end < rm_end)
+ prebuilt_readmarkers_end = rm_end;
+ if (prebuilt_objects_start > (utarget & ~4095))
+ prebuilt_objects_start = utarget & ~4095;
+
+ if (prebuilt_readmarkers_end > prebuilt_objects_start) {
+ fprintf(stderr,
+ "stm_copy_prebuilt_objects: read markers ending at 0x%lx "
+ "overlap with prebuilt objects starting at 0x%lx\n",
+ (long)prebuilt_readmarkers_end,
+ (long)prebuilt_objects_start);
+ abort();
+ }
+ }
+
+ uint64_t start_page = utarget / 4096;
+ uint64_t end_page = (utarget + size + 4095) / 4096;
pages_initialize_shared(start_page, end_page - start_page);
char *segment_base = get_segment_base(0);
memcpy(REAL_ADDRESS(segment_base, utarget), source, size);
}
+
+static void reset_transaction_read_version_prebuilt(void)
+{
+ memset(REAL_ADDRESS(STM_SEGMENT->segment_base, prebuilt_readmarkers_start),
+ 0, prebuilt_readmarkers_end - prebuilt_readmarkers_start);
+}
More information about the pypy-commit
mailing list