diff options
| author | David Jones | 2003-02-19 16:34:08 +0000 |
|---|---|---|
| committer | David Jones | 2003-02-19 16:34:08 +0000 |
| commit | 091cf2833d0363e11ba19f177f840142ae11e89e (patch) | |
| tree | c2fe3bbea9134f929a5b85474c403ce8472b7056 /mps/code | |
| parent | c16171e52892c2634b19fe3abfbaa8d783b3ac97 (diff) | |
| download | emacs-091cf2833d0363e11ba19f177f840142ae11e89e.tar.gz emacs-091cf2833d0363e11ba19f177f840142ae11e89e.zip | |
Mps: added mps_message_type_gc_start()
Copied from Perforce
Change: 39781
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/amcss.c | 62 | ||||
| -rw-r--r-- | mps/code/message.c | 2 | ||||
| -rw-r--r-- | mps/code/mpm.h | 1 | ||||
| -rw-r--r-- | mps/code/mps.h | 4 | ||||
| -rw-r--r-- | mps/code/mpsi.c | 18 | ||||
| -rw-r--r-- | mps/code/testlib.h | 2 | ||||
| -rw-r--r-- | mps/code/trace.c | 11 |
7 files changed, 77 insertions, 23 deletions
diff --git a/mps/code/amcss.c b/mps/code/amcss.c index db6432bcb87..76a5088360f 100644 --- a/mps/code/amcss.c +++ b/mps/code/amcss.c | |||
| @@ -47,33 +47,54 @@ static mps_addr_t exactRoots[exactRootsCOUNT]; | |||
| 47 | static mps_addr_t ambigRoots[ambigRootsCOUNT]; | 47 | static mps_addr_t ambigRoots[ambigRootsCOUNT]; |
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | /* report - report statistics from any terminated GCs */ | 50 | /* report - report statistics from any messages */ |
| 51 | 51 | ||
| 52 | static void report(mps_arena_t arena) | 52 | static void report(mps_arena_t arena) |
| 53 | { | 53 | { |
| 54 | mps_message_t message; | ||
| 55 | static int nCollections = 0; | 54 | static int nCollections = 0; |
| 55 | mps_message_type_t type; | ||
| 56 | 56 | ||
| 57 | while (mps_message_get(&message, arena, mps_message_type_gc())) { | 57 | while(mps_message_queue_type(&type, arena)) { |
| 58 | size_t live, condemned, not_condemned; | 58 | mps_message_t message; |
| 59 | 59 | ||
| 60 | live = mps_message_gc_live_size(arena, message); | 60 | cdie(mps_message_get(&message, arena, type), "message get"); |
| 61 | condemned = mps_message_gc_condemned_size(arena, message); | 61 | |
| 62 | not_condemned = mps_message_gc_not_condemned_size(arena, message); | 62 | switch(type) { |
| 63 | 63 | /* @@@@ is using these macros in a switch supported? */ | |
| 64 | printf("\nCollection %d finished:\n", ++nCollections); | 64 | case mps_message_type_gc(): |
| 65 | printf("live %lu\n", (unsigned long)live); | 65 | { |
| 66 | printf("condemned %lu\n", (unsigned long)condemned); | 66 | size_t live, condemned, not_condemned; |
| 67 | printf("not_condemned %lu\n", (unsigned long)not_condemned); | 67 | |
| 68 | 68 | live = mps_message_gc_live_size(arena, message); | |
| 69 | condemned = mps_message_gc_condemned_size(arena, message); | ||
| 70 | not_condemned = mps_message_gc_not_condemned_size(arena, message); | ||
| 71 | |||
| 72 | printf("\nCollection %d finished:\n", ++nCollections); | ||
| 73 | printf("live %lu\n", (unsigned long)live); | ||
| 74 | printf("condemned %lu\n", (unsigned long)condemned); | ||
| 75 | printf("not_condemned %lu\n", (unsigned long)not_condemned); | ||
| 76 | |||
| 77 | if(condemned > (gen1SIZE + gen2SIZE + (size_t)128) * 1024) { | ||
| 78 | /* When condemned size is larger than could happen in a gen 2 | ||
| 79 | * collection (discounting ramps, natch), guess that was a dynamic | ||
| 80 | * collection, and reset the commit limit, so it doesn't run out. */ | ||
| 81 | die(mps_arena_commit_limit_set(arena, 2 * testArenaSIZE), | ||
| 82 | "set limit"); | ||
| 83 | } | ||
| 84 | } | ||
| 85 | break; | ||
| 86 | case mps_message_type_gc_start(): | ||
| 87 | printf("\nCollection started. Because:\n"); | ||
| 88 | printf("%s\n", mps_message_gc_start_why(arena, message)); | ||
| 89 | |||
| 90 | break; | ||
| 91 | default: | ||
| 92 | cdie(0, "unknown message type"); | ||
| 93 | } | ||
| 69 | mps_message_discard(arena, message); | 94 | mps_message_discard(arena, message); |
| 70 | |||
| 71 | if (condemned > (gen1SIZE + gen2SIZE + (size_t)128) * 1024) | ||
| 72 | /* When condemned size is larger than could happen in a gen 2 | ||
| 73 | * collection (discounting ramps, natch), guess that was a dynamic | ||
| 74 | * collection, and reset the commit limit, so it doesn't run out. */ | ||
| 75 | die(mps_arena_commit_limit_set(arena, 2 * testArenaSIZE), "set limit"); | ||
| 76 | } | 95 | } |
| 96 | |||
| 97 | return; | ||
| 77 | } | 98 | } |
| 78 | 99 | ||
| 79 | 100 | ||
| @@ -276,6 +297,7 @@ int main(int argc, char **argv) | |||
| 276 | die(mps_arena_create(&arena, mps_arena_class_vm(), 2*testArenaSIZE), | 297 | die(mps_arena_create(&arena, mps_arena_class_vm(), 2*testArenaSIZE), |
| 277 | "arena_create"); | 298 | "arena_create"); |
| 278 | mps_message_type_enable(arena, mps_message_type_gc()); | 299 | mps_message_type_enable(arena, mps_message_type_gc()); |
| 300 | mps_message_type_enable(arena, mps_message_type_gc_start()); | ||
| 279 | die(mps_arena_commit_limit_set(arena, testArenaSIZE), "set limit"); | 301 | die(mps_arena_commit_limit_set(arena, testArenaSIZE), "set limit"); |
| 280 | die(mps_thread_reg(&thread, arena), "thread_reg"); | 302 | die(mps_thread_reg(&thread, arena), "thread_reg"); |
| 281 | mps_tramp(&r, test, arena, 0); | 303 | mps_tramp(&r, test, arena, 0); |
diff --git a/mps/code/message.c b/mps/code/message.c index a5f2651b928..2d12432acff 100644 --- a/mps/code/message.c +++ b/mps/code/message.c | |||
| @@ -35,7 +35,7 @@ static void MessageDelete(Message message); | |||
| 35 | * Message is on queue if and only if its ring is not a singleton. | 35 | * Message is on queue if and only if its ring is not a singleton. |
| 36 | */ | 36 | */ |
| 37 | 37 | ||
| 38 | static Bool MessageOnQueue(Message message) | 38 | Bool MessageOnQueue(Message message) |
| 39 | { | 39 | { |
| 40 | AVERT(Message, message); | 40 | AVERT(Message, message); |
| 41 | 41 | ||
diff --git a/mps/code/mpm.h b/mps/code/mpm.h index 0badeaa737c..ebaf87b4d7c 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h | |||
| @@ -290,6 +290,7 @@ extern Arena MessageArena(Message message); | |||
| 290 | extern void MessageInit(Arena arena, Message message, | 290 | extern void MessageInit(Arena arena, Message message, |
| 291 | MessageClass class, MessageType type); | 291 | MessageClass class, MessageType type); |
| 292 | extern void MessageFinish(Message message); | 292 | extern void MessageFinish(Message message); |
| 293 | extern Bool MessageOnQueue(Message message); | ||
| 293 | extern void MessagePost(Arena arena, Message message); | 294 | extern void MessagePost(Arena arena, Message message); |
| 294 | extern Bool MessagePoll(Arena arena); | 295 | extern Bool MessagePoll(Arena arena); |
| 295 | extern MessageType MessageGetType(Message message); | 296 | extern MessageType MessageGetType(Message message); |
diff --git a/mps/code/mps.h b/mps/code/mps.h index b20885c05ab..6493de0c598 100644 --- a/mps/code/mps.h +++ b/mps/code/mps.h | |||
| @@ -532,6 +532,10 @@ extern size_t mps_message_gc_condemned_size(mps_arena_t, mps_message_t); | |||
| 532 | extern size_t mps_message_gc_not_condemned_size(mps_arena_t, | 532 | extern size_t mps_message_gc_not_condemned_size(mps_arena_t, |
| 533 | mps_message_t); | 533 | mps_message_t); |
| 534 | 534 | ||
| 535 | /* MPS_MESSAGE_TYPE_GC_START */ | ||
| 536 | |||
| 537 | extern const char *mps_message_gc_start_why(mps_arena_t, mps_message_t); | ||
| 538 | |||
| 535 | 539 | ||
| 536 | /* Finalization */ | 540 | /* Finalization */ |
| 537 | 541 | ||
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index 06ad8a0ae1b..5f224f56c40 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c | |||
| @@ -1719,6 +1719,24 @@ size_t mps_message_gc_not_condemned_size(mps_arena_t mps_arena, | |||
| 1719 | return (size_t)size; | 1719 | return (size_t)size; |
| 1720 | } | 1720 | } |
| 1721 | 1721 | ||
| 1722 | /* MPS_MESSAGE_TYPE_GC_START */ | ||
| 1723 | const char *mps_message_gc_start_why(mps_arena_t mps_arena, | ||
| 1724 | mps_message_t mps_message) | ||
| 1725 | { | ||
| 1726 | const char *s; | ||
| 1727 | Arena arena = (Arena)mps_arena; | ||
| 1728 | Message message = (Message)mps_message; | ||
| 1729 | |||
| 1730 | ArenaEnter(arena); | ||
| 1731 | |||
| 1732 | AVERT(Arena, arena); | ||
| 1733 | |||
| 1734 | s = MessageGCStartWhy(message); | ||
| 1735 | |||
| 1736 | ArenaLeave(arena); | ||
| 1737 | |||
| 1738 | return s; | ||
| 1739 | } | ||
| 1722 | 1740 | ||
| 1723 | /* Telemetry */ | 1741 | /* Telemetry */ |
| 1724 | 1742 | ||
diff --git a/mps/code/testlib.h b/mps/code/testlib.h index 37518548c7a..415aaaa8ded 100644 --- a/mps/code/testlib.h +++ b/mps/code/testlib.h | |||
| @@ -99,7 +99,7 @@ extern void die(mps_res_t res, const char *s); | |||
| 99 | 99 | ||
| 100 | /* die_expect -- get expected result or die | 100 | /* die_expect -- get expected result or die |
| 101 | * | 101 | * |
| 102 | * If the first argument is not thename as the second argument, | 102 | * If the first argument is not the same as the second argument, |
| 103 | * prints the third argument on stderr and exits the program. | 103 | * prints the third argument on stderr and exits the program. |
| 104 | * Otherwise does nothing. | 104 | * Otherwise does nothing. |
| 105 | * | 105 | * |
diff --git a/mps/code/trace.c b/mps/code/trace.c index 84dd7880bd0..757aee17db4 100644 --- a/mps/code/trace.c +++ b/mps/code/trace.c | |||
| @@ -398,6 +398,7 @@ Bool TraceCheck(Trace trace) | |||
| 398 | if (trace->chain != NULL) | 398 | if (trace->chain != NULL) |
| 399 | CHECKU(Chain, trace->chain); | 399 | CHECKU(Chain, trace->chain); |
| 400 | /* @@@@ checks for counts missing */ | 400 | /* @@@@ checks for counts missing */ |
| 401 | CHECKD(TraceStartMessage, &trace->startMessage); | ||
| 401 | return TRUE; | 402 | return TRUE; |
| 402 | } | 403 | } |
| 403 | 404 | ||
| @@ -1524,9 +1525,10 @@ static Res rootGrey(Root root, void *p) | |||
| 1524 | void TraceStart(Trace trace, double mortality, double finishingTime) | 1525 | void TraceStart(Trace trace, double mortality, double finishingTime) |
| 1525 | { | 1526 | { |
| 1526 | Arena arena; | 1527 | Arena arena; |
| 1528 | Message message; | ||
| 1529 | Res res; | ||
| 1527 | Seg seg; | 1530 | Seg seg; |
| 1528 | Size size; | 1531 | Size size; |
| 1529 | Res res; | ||
| 1530 | 1532 | ||
| 1531 | AVERT(Trace, trace); | 1533 | AVERT(Trace, trace); |
| 1532 | AVER(trace->state == TraceINIT); | 1534 | AVER(trace->state == TraceINIT); |
| @@ -1535,6 +1537,13 @@ void TraceStart(Trace trace, double mortality, double finishingTime) | |||
| 1535 | 1537 | ||
| 1536 | arena = trace->arena; | 1538 | arena = trace->arena; |
| 1537 | 1539 | ||
| 1540 | message = TraceStartMessageMessage(&trace->startMessage); | ||
| 1541 | /* Check message is not on queue. If it _is_ then client | ||
| 1542 | must have not read it yet. */ | ||
| 1543 | if(!MessageOnQueue(message)) { | ||
| 1544 | MessagePost(arena, message); | ||
| 1545 | } | ||
| 1546 | |||
| 1538 | /* From the already set up white set, derive a grey set. */ | 1547 | /* From the already set up white set, derive a grey set. */ |
| 1539 | 1548 | ||
| 1540 | /* @@@@ Instead of iterating over all the segments, we could */ | 1549 | /* @@@@ Instead of iterating over all the segments, we could */ |