diff options
| author | David Jones | 2003-07-09 16:42:29 +0100 |
|---|---|---|
| committer | David Jones | 2003-07-09 16:42:29 +0100 |
| commit | 05af441d05ade5408f7c4532b0f4e5818ecf5e35 (patch) | |
| tree | fb18554673677ccbb6d21f0c3cd46eda88d1ad59 /mps/code | |
| parent | c17b41090f3066a546d66b2566f54f92b651fb05 (diff) | |
| download | emacs-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.c | 36 | ||||
| -rw-r--r-- | mps/code/mpm.h | 2 | ||||
| -rw-r--r-- | mps/code/mpsi.c | 7 |
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$"); | |||
| 36 | static Bool arenaRingInit = FALSE; | 36 | static Bool arenaRingInit = FALSE; |
| 37 | static RingStruct arenaRing; /* <design/arena/#static.ring> */ | 37 | static RingStruct arenaRing; /* <design/arena/#static.ring> */ |
| 38 | 38 | ||
| 39 | /* forward declarations */ | ||
| 40 | void arenaEnterLock(Arena, void (*)(Lock)); | ||
| 41 | void 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 |
| 422 | void ArenaEnter(Arena arena) | 425 | void ArenaEnter(Arena arena) |
| 423 | { | 426 | { |
| 427 | arenaEnterLock(arena, LockClaim); | ||
| 428 | } | ||
| 429 | #endif | ||
| 430 | |||
| 431 | void 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 | |||
| 448 | void 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 |
| 443 | void ArenaLeave(Arena arena) | 462 | void ArenaLeave(Arena arena) |
| 444 | { | 463 | { |
| 464 | arenaLeaveLock(arena, LockReleaseMPM); | ||
| 465 | } | ||
| 466 | #endif | ||
| 467 | |||
| 468 | void 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 | ||
| 476 | void 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 | ||
| 466 | extern void ArenaEnterRecursive(Arena arena); | ||
| 467 | extern void ArenaLeaveRecursive(Arena arena); | ||
| 466 | 468 | ||
| 467 | extern void (ArenaPoll)(Globals globals); | 469 | extern 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 | ||