aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorDavid Jones2003-02-19 16:34:08 +0000
committerDavid Jones2003-02-19 16:34:08 +0000
commit091cf2833d0363e11ba19f177f840142ae11e89e (patch)
treec2fe3bbea9134f929a5b85474c403ce8472b7056 /mps/code
parentc16171e52892c2634b19fe3abfbaa8d783b3ac97 (diff)
downloademacs-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.c62
-rw-r--r--mps/code/message.c2
-rw-r--r--mps/code/mpm.h1
-rw-r--r--mps/code/mps.h4
-rw-r--r--mps/code/mpsi.c18
-rw-r--r--mps/code/testlib.h2
-rw-r--r--mps/code/trace.c11
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];
47static mps_addr_t ambigRoots[ambigRootsCOUNT]; 47static 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
52static void report(mps_arena_t arena) 52static 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
38static Bool MessageOnQueue(Message message) 38Bool 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);
290extern void MessageInit(Arena arena, Message message, 290extern void MessageInit(Arena arena, Message message,
291 MessageClass class, MessageType type); 291 MessageClass class, MessageType type);
292extern void MessageFinish(Message message); 292extern void MessageFinish(Message message);
293extern Bool MessageOnQueue(Message message);
293extern void MessagePost(Arena arena, Message message); 294extern void MessagePost(Arena arena, Message message);
294extern Bool MessagePoll(Arena arena); 295extern Bool MessagePoll(Arena arena);
295extern MessageType MessageGetType(Message message); 296extern 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);
532extern size_t mps_message_gc_not_condemned_size(mps_arena_t, 532extern 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
537extern 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 */
1723const 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)
1524void TraceStart(Trace trace, double mortality, double finishingTime) 1525void 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 */