aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorDavid Jones2003-07-09 16:42:29 +0100
committerDavid Jones2003-07-09 16:42:29 +0100
commit05af441d05ade5408f7c4532b0f4e5818ecf5e35 (patch)
treefb18554673677ccbb6d21f0c3cd46eda88d1ad59 /mps/code
parentc17b41090f3066a546d66b2566f54f92b651fb05 (diff)
downloademacs-05af441d05ade5408f7c4532b0f4e5818ecf5e35.tar.gz
emacs-05af441d05ade5408f7c4532b0f4e5818ecf5e35.zip
Mps: can now call mps_arena_has_addr during
mps_arena_formatted_objects_walk. test walkt0 is witness Copied from Perforce Change: 50108 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/global.c36
-rw-r--r--mps/code/mpm.h2
-rw-r--r--mps/code/mpsi.c7
3 files changed, 39 insertions, 6 deletions
diff --git a/mps/code/global.c b/mps/code/global.c
index db4a9f2fd0d..051ba680480 100644
--- a/mps/code/global.c
+++ b/mps/code/global.c
@@ -36,6 +36,9 @@ SRCID(global, "$Id$");
36static Bool arenaRingInit = FALSE; 36static Bool arenaRingInit = FALSE;
37static RingStruct arenaRing; /* <design/arena/#static.ring> */ 37static RingStruct arenaRing; /* <design/arena/#static.ring> */
38 38
39/* forward declarations */
40void arenaEnterLock(Arena, void (*)(Lock));
41void arenaLeaveLock(Arena, void (*)(Lock));
39 42
40/* ArenaControlPool -- get the control pool */ 43/* ArenaControlPool -- get the control pool */
41 44
@@ -421,15 +424,31 @@ void (ArenaEnter)(Arena arena)
421#else 424#else
422void ArenaEnter(Arena arena) 425void ArenaEnter(Arena arena)
423{ 426{
427 arenaEnterLock(arena, LockClaim);
428}
429#endif
430
431void arenaEnterLock(Arena arena, void (*lock)(Lock))
432{
433 /* This check is safe to do outside the lock. Unless the client
434 is also calling ArenaDestroy, but that's a protocol violation by
435 the client if so. */
424 AVER(CHECKT(Arena, arena)); 436 AVER(CHECKT(Arena, arena));
425 437
426 StackProbe(StackProbeDEPTH); 438 StackProbe(StackProbeDEPTH);
427 LockClaim(ArenaGlobals(arena)->lock); 439 lock(ArenaGlobals(arena)->lock);
428 AVERT(Arena, arena); /* can't AVER it until we've got the lock */ 440 AVERT(Arena, arena); /* can't AVER it until we've got the lock */
429 ShieldEnter(arena); 441 ShieldEnter(arena);
430} 442}
431#endif
432 443
444/* Same as ArenaEnter, but for the few functions that need to be
445 reentrant with respect to some part of the MPS.
446 For example, mps_arena_has_addr. */
447
448void ArenaEnterRecursive(Arena arena)
449{
450 arenaEnterLock(arena, LockClaimRecursive);
451}
433 452
434/* ArenaLeave -- leave the state where you can look at MPM data structures */ 453/* ArenaLeave -- leave the state where you can look at MPM data structures */
435 454
@@ -442,13 +461,22 @@ void (ArenaLeave)(Arena arena)
442#else 461#else
443void ArenaLeave(Arena arena) 462void ArenaLeave(Arena arena)
444{ 463{
464 arenaLeaveLock(arena, LockReleaseMPM);
465}
466#endif
467
468void arenaLeaveLock(Arena arena, void (*unlock)(Lock))
469{
445 AVERT(Arena, arena); 470 AVERT(Arena, arena);
446 ShieldLeave(arena); 471 ShieldLeave(arena);
447 ProtSync(arena); /* <design/prot/#if.sync> */ 472 ProtSync(arena); /* <design/prot/#if.sync> */
448 LockReleaseMPM(ArenaGlobals(arena)->lock); 473 unlock(ArenaGlobals(arena)->lock);
449} 474}
450#endif
451 475
476void ArenaLeaveRecursive(Arena arena)
477{
478 arenaLeaveLock(arena, LockReleaseRecursive);
479}
452 480
453/* mps_exception_info -- pointer to exception info 481/* mps_exception_info -- pointer to exception info
454 * 482 *
diff --git a/mps/code/mpm.h b/mps/code/mpm.h
index c2b88250774..e29a902ea32 100644
--- a/mps/code/mpm.h
+++ b/mps/code/mpm.h
@@ -463,6 +463,8 @@ extern void (ArenaLeave)(Arena arena);
463#define ArenaLeave(arena) UNUSED(arena) 463#define ArenaLeave(arena) UNUSED(arena)
464#endif 464#endif
465 465
466extern void ArenaEnterRecursive(Arena arena);
467extern void ArenaLeaveRecursive(Arena arena);
466 468
467extern void (ArenaPoll)(Globals globals); 469extern void (ArenaPoll)(Globals globals);
468#ifdef MPS_PROD_EPCORE 470#ifdef MPS_PROD_EPCORE
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c
index 316ff6cf03e..d855a68de41 100644
--- a/mps/code/mpsi.c
+++ b/mps/code/mpsi.c
@@ -451,10 +451,13 @@ mps_bool_t mps_arena_has_addr(mps_arena_t mps_arena, mps_addr_t p)
451 Bool b; 451 Bool b;
452 Arena arena = (Arena)mps_arena; 452 Arena arena = (Arena)mps_arena;
453 453
454 ArenaEnter(arena); 454 /* One of the few functions that can be called
455 during the call to an MPS function. IE this function
456 can be called when walking the heap. */
457 ArenaEnterRecursive(arena);
455 AVERT(Arena, arena); 458 AVERT(Arena, arena);
456 b = ArenaHasAddr(arena, (Addr)p); 459 b = ArenaHasAddr(arena, (Addr)p);
457 ArenaLeave(arena); 460 ArenaLeaveRecursive(arena);
458 return b; 461 return b;
459} 462}
460 463