aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorNick Barnes2001-11-23 15:26:23 +0000
committerNick Barnes2001-11-23 15:26:23 +0000
commiteef2f4743c288d2b2e7846129430949186b21d98 (patch)
tree3b7545d340d4032e78411c1901eeb0b87d556e09 /mps/code
parent04fe0477bb432d4f76f6f4d4b244286e19105978 (diff)
parent35651f3b1d1ee333d72fabd7606723bed87c40ef (diff)
downloademacs-eef2f4743c288d2b2e7846129430949186b21d98.tar.gz
emacs-eef2f4743c288d2b2e7846129430949186b21d98.zip
Merging mps_arena_has_addr() stuff from configura branch to master sources.
Copied from Perforce Change: 24163 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/amcss.c17
-rw-r--r--mps/code/arena.c11
-rw-r--r--mps/code/mpm.h2
-rw-r--r--mps/code/mps.h2
-rw-r--r--mps/code/mpsi.c14
5 files changed, 43 insertions, 3 deletions
diff --git a/mps/code/amcss.c b/mps/code/amcss.c
index 454c4c777ad..32278402d74 100644
--- a/mps/code/amcss.c
+++ b/mps/code/amcss.c
@@ -50,7 +50,7 @@ static void enable(mps_arena_t arena)
50static void report(mps_arena_t arena) 50static void report(mps_arena_t arena)
51{ 51{
52 mps_message_t message; 52 mps_message_t message;
53 53
54 while (mps_message_get(&message, arena, mps_message_type_gc())) { 54 while (mps_message_get(&message, arena, mps_message_type_gc())) {
55 size_t live, condemned, not_condemned; 55 size_t live, condemned, not_condemned;
56 56
@@ -156,10 +156,23 @@ static void *test(void *arg, size_t s)
156 collections = c; 156 collections = c;
157 printf("\nCollection %lu, %lu objects.\n", 157 printf("\nCollection %lu, %lu objects.\n",
158 c, objs); 158 c, objs);
159 do {
160 mps_addr_t p = (mps_addr_t)rnd();
161 if (mps_arena_has_addr(arena, p)) {
162 printf("0x%08x is in arena\n", (int)p);
163 break;
164 }
165 } while(1);
166
159 report(arena); 167 report(arena);
160 for(r = 0; r < exactRootsCOUNT; ++r) 168 for(r = 0; r < exactRootsCOUNT; ++r)
161 cdie(exactRoots[r] == objNULL || dylan_check(exactRoots[r]), 169 cdie(exactRoots[r] == objNULL ||
170 (dylan_check(exactRoots[r]) &&
171 mps_arena_has_addr(arena, exactRoots[r])),
162 "all roots check"); 172 "all roots check");
173 cdie(!mps_arena_has_addr(arena, NULL),
174 "NULL in arena");
175
163 if(collections == collectionsCOUNT / 2) { 176 if(collections == collectionsCOUNT / 2) {
164 unsigned long object_count = 0; 177 unsigned long object_count = 0;
165 mps_arena_park(arena); 178 mps_arena_park(arena);
diff --git a/mps/code/arena.c b/mps/code/arena.c
index c0bb7888524..83c3ee600ff 100644
--- a/mps/code/arena.c
+++ b/mps/code/arena.c
@@ -647,3 +647,14 @@ Res ArenaNoExtend(Arena arena, Addr base, Size size)
647 NOTREACHED; 647 NOTREACHED;
648 return ResUNIMPL; 648 return ResUNIMPL;
649} 649}
650
651
652/* Has Addr */
653
654Bool ArenaHasAddr(Arena arena, Addr addr)
655{
656 Seg seg;
657
658 AVERT(Arena, arena);
659 return SegOfAddr(&seg, arena, addr);
660}
diff --git a/mps/code/mpm.h b/mps/code/mpm.h
index 0572b1a5a20..a810d6b0b40 100644
--- a/mps/code/mpm.h
+++ b/mps/code/mpm.h
@@ -523,11 +523,11 @@ extern void (ArenaPoll)(Globals globals);
523/* .nogc.why: ScriptWorks doesn't use MM-provided incremental GC, so */ 523/* .nogc.why: ScriptWorks doesn't use MM-provided incremental GC, so */
524/* doesn't need to poll when allocating. */ 524/* doesn't need to poll when allocating. */
525 525
526
527extern void ArenaClamp(Globals globals); 526extern void ArenaClamp(Globals globals);
528extern void ArenaRelease(Globals globals); 527extern void ArenaRelease(Globals globals);
529extern void ArenaPark(Globals globals); 528extern void ArenaPark(Globals globals);
530extern Res ArenaCollect(Globals globals); 529extern Res ArenaCollect(Globals globals);
530extern Bool ArenaHasAddr(Arena arena, Addr addr);
531 531
532extern Res ControlInit(Arena arena); 532extern Res ControlInit(Arena arena);
533extern void ControlFinish(Arena arena); 533extern void ControlFinish(Arena arena);
diff --git a/mps/code/mps.h b/mps/code/mps.h
index 7339319d815..5af0608b240 100644
--- a/mps/code/mps.h
+++ b/mps/code/mps.h
@@ -262,6 +262,8 @@ extern size_t mps_arena_spare_commit_limit(mps_arena_t);
262extern size_t mps_space_reserved(mps_space_t); 262extern size_t mps_space_reserved(mps_space_t);
263extern size_t mps_space_committed(mps_space_t); 263extern size_t mps_space_committed(mps_space_t);
264 264
265extern mps_bool_t mps_arena_has_addr(mps_arena_t, mps_addr_t);
266
265/* Client memory arenas */ 267/* Client memory arenas */
266extern mps_res_t mps_arena_extend(mps_arena_t, mps_addr_t, size_t); 268extern mps_res_t mps_arena_extend(mps_arena_t, mps_addr_t, size_t);
267extern mps_res_t mps_arena_retract(mps_arena_t, mps_addr_t, size_t); 269extern mps_res_t mps_arena_retract(mps_arena_t, mps_addr_t, size_t);
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c
index c72bf7549b1..cff889c8872 100644
--- a/mps/code/mpsi.c
+++ b/mps/code/mpsi.c
@@ -432,6 +432,20 @@ void mps_space_destroy(mps_space_t mps_space)
432} 432}
433#endif 433#endif
434 434
435/* mps_arena_has_addr -- is this address managed by this arena? */
436
437mps_bool_t mps_arena_has_addr(mps_arena_t mps_arena, mps_addr_t p)
438{
439 Bool b;
440 Arena arena = (Arena)mps_arena;
441
442 ArenaEnter(arena);
443 AVERT(Arena, arena);
444 b = ArenaHasAddr(arena, (Addr)p);
445 ArenaLeave(arena);
446 return b;
447}
448
435 449
436/* mps_fmt_create_A -- create an object format of variant A 450/* mps_fmt_create_A -- create an object format of variant A
437 * 451 *