aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/arenavm.c56
-rw-r--r--mps/code/diag.c25
-rw-r--r--mps/code/mpm.c6
-rw-r--r--mps/code/zcoll.c33
4 files changed, 101 insertions, 19 deletions
diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c
index 3fab5f4d547..399145f3629 100644
--- a/mps/code/arenavm.c
+++ b/mps/code/arenavm.c
@@ -1619,18 +1619,44 @@ static void VMFree(Addr base, Size size, Pool pool)
1619 return; 1619 return;
1620} 1620}
1621 1621
1622
1623/* M_whole, M_frac -- print count of bytes as Megabytes
1624 *
1625 * Split into a whole number of MB, "m" for the decimal point, and
1626 * then the decimal fraction (thousandths of a MB, ie. kB).
1627 *
1628 * Input: 208896
1629 * Output: (Megabytes) 0m209
1630 */
1631#define bPerM (1000000UL) /* Megabytes */
1632#define bThou (1000UL)
1633DIAG_DECL(
1634static Count M_whole(size_t bytes)
1635{
1636 size_t M; /* MBs */
1637 M = (bytes + (bThou / 2)) / bPerM;
1638 return M;
1639}
1640static Count M_frac(size_t bytes)
1641{
1642 Count Mthou; /* thousandths of a MB */
1643 Mthou = (bytes + (bThou / 2)) / bThou;
1644 Mthou = Mthou % 1000;
1645 return Mthou;
1646}
1647)
1648
1649
1622static void VMCompact(Arena arena, Trace trace) 1650static void VMCompact(Arena arena, Trace trace)
1623{ 1651{
1624 VMArena vmArena; 1652 VMArena vmArena;
1625 Ring node, next; 1653 Ring node, next;
1626 DIAG_DECL( Size vmem1; ) 1654 DIAG_DECL( Size vmem1; )
1627 DIAG_DECL( Size vmem2; )
1628 DIAG_DECL( Size vmemD; )
1629 DIAG_DECL( Count count; ) 1655 DIAG_DECL( Count count; )
1630 1656
1631 vmArena = Arena2VMArena(arena); 1657 vmArena = Arena2VMArena(arena);
1632 AVERT(VMArena, vmArena); 1658 AVERT(VMArena, vmArena);
1633 UNUSED(trace); /* it's there for better diag; not used yet */ 1659 AVERT(Trace, trace);
1634 1660
1635 /* Destroy any empty chunks (except the primary). */ 1661 /* Destroy any empty chunks (except the primary). */
1636 sparePagesPurge(vmArena); 1662 sparePagesPurge(vmArena);
@@ -1638,6 +1664,7 @@ static void VMCompact(Arena arena, Trace trace)
1638 vmem1 = VMArenaReserved(arena); 1664 vmem1 = VMArenaReserved(arena);
1639 count = 0; 1665 count = 0;
1640 ); 1666 );
1667
1641 RING_FOR(node, &arena->chunkRing, next) { 1668 RING_FOR(node, &arena->chunkRing, next) {
1642 Chunk chunk = RING_ELT(Chunk, chunkRing, node); 1669 Chunk chunk = RING_ELT(Chunk, chunkRing, node);
1643 if(chunk != arena->primary 1670 if(chunk != arena->primary
@@ -1646,17 +1673,30 @@ static void VMCompact(Arena arena, Trace trace)
1646 DIAG( count += 1; ); 1673 DIAG( count += 1; );
1647 } 1674 }
1648 } 1675 }
1676
1649 DIAG( 1677 DIAG(
1650 vmem2 = VMArenaReserved(arena); 1678 Size vmem2 = VMArenaReserved(arena);
1651 vmemD = vmem1 - vmem2; 1679 Size vmemD = vmem1 - vmem2;
1680 Size live = trace->forwardedSize + trace->preservedInPlaceSize;
1681 Size livePerc = live / (trace->condemned / 100);
1652 1682
1653 if(vmemD != 0) { 1683 if(vmemD != 0
1684 || trace->why == TraceStartWhyCLIENTFULL_INCREMENTAL
1685 || trace->why == TraceStartWhyCLIENTFULL_BLOCK) {
1654 DIAG_SINGLEF(( "VMCompact", 1686 DIAG_SINGLEF(( "VMCompact",
1655 "vmem was $W, released $W, now $W", vmem1, vmemD, vmem2, 1687 "vmem was $Um$3, ", M_whole(vmem1), M_frac(vmem1),
1688 "released $Um$3, ", M_whole(vmemD), M_frac(vmemD),
1689 "now $Um$3", M_whole(vmem2), M_frac(vmem2),
1690 " (why $U", trace->why,
1691 ": $Um$3", M_whole(trace->condemned), M_frac(trace->condemned),
1692 "[->$Um$3", M_whole(live), M_frac(live),
1693 " $U%-live", livePerc,
1694 " $Um$3-stuck]", M_whole(trace->preservedInPlaceSize), M_frac(trace->preservedInPlaceSize),
1695 " ($Um$3-not)", M_whole(trace->notCondemned), M_frac(trace->notCondemned),
1696 " )",
1656 NULL)); 1697 NULL));
1657 } 1698 }
1658 ); 1699 );
1659
1660} 1700}
1661 1701
1662mps_res_t mps_arena_vm_growth(mps_arena_t mps_arena, 1702mps_res_t mps_arena_vm_growth(mps_arena_t mps_arena,
diff --git a/mps/code/diag.c b/mps/code/diag.c
index ba3688157d8..479b0e4b92e 100644
--- a/mps/code/diag.c
+++ b/mps/code/diag.c
@@ -28,21 +28,32 @@ typedef struct RuleStruct {
28/* RulesGlobal -- throw away some diags (see INSTRUCTIONS below) */ 28/* RulesGlobal -- throw away some diags (see INSTRUCTIONS below) */
29 29
30struct RuleStruct RulesGlobal[] = { 30struct RuleStruct RulesGlobal[] = {
31 { "-", "*", "*", "*" },
32 { "+", "DiagFilter_Rules", "*", "*" },
33 { "+", "VMCompact", "*", "*" },
34 /* ----v---- always on please (RHSK) ----v---- */
35 { "+", "traceSetSignalEmergency", "*", "*" },
36 { NULL, "", "", "" }
37};
38
39struct RuleStruct RulesGlobal_RHSK[] = {
31 { "+", "*", "*", "*" }, 40 { "+", "*", "*", "*" },
32 { "+", "DiagFilter_Rules", "*", "*" }, 41 { "+", "DiagFilter_Rules", "*", "*" },
33 { "-", "DIAGTEST_", "*", "*" }, 42 { "-", "DIAGTEST_", "*", "*" },
34 { "-", "AMCTraceEnd_pageret", "*", "*" }, 43 { "+", "AMCTraceEnd_pageret", "*", "*" },
35 { "-", "ChainCondemnAuto", "*", "*" }, 44 { "-", "ChainCondemnAuto", "*", "*" },
36 { "+", "VM_ix_", "*", "*" }, 45 { "+", "VM_ix_", "*", "*" },
37 { "-", "vmArenaExtend_", "*", "*" }, 46 { "-", "vmArenaExtend_", "*", "*" },
38 { "-", "traceFindGrey", "*", "*" }, 47 { "-", "traceFindGrey", "*", "*" },
39 { "+", "TraceStart", "*", "*" }, 48 { "-", "TraceStart", "*", "*" },
49 { "+", "TraceStart", "*", "controlPool" },
50 { "+", "TraceStart", "*", "reserved" },
51 { "+", "TraceStart", "*", "committed" },
52 { "+", "TraceStart", "*", "genZoneSet" },
40 { "-", "TraceStart", "because code 1", "*" }, 53 { "-", "TraceStart", "because code 1", "*" },
41 { "+", "TraceStart", "because code 2", "controlPool" }, 54 { "+", "VMCompact", "*", "*" },
42 { "+", "TraceStart", "because code 2", "reserved" }, 55 { "-", "VMCompact_hex", "*", "*" },
43 { "+", "TraceStart", "because code 2", "committed" }, 56 { "+", "VM_ix_Create", "*", "*" },
44 { "+", "TraceStart", "because code 2", "genZoneSet" },
45 { "+", "VM_ix_", "*", "*" },
46 /* ----v---- always on please (RHSK) ----v---- */ 57 /* ----v---- always on please (RHSK) ----v---- */
47 { "+", "traceSetSignalEmergency", "*", "*" }, 58 { "+", "traceSetSignalEmergency", "*", "*" },
48 { NULL, "", "", "" } 59 { NULL, "", "", "" }
diff --git a/mps/code/mpm.c b/mps/code/mpm.c
index 84c9fdc870b..a0d66350e7b 100644
--- a/mps/code/mpm.c
+++ b/mps/code/mpm.c
@@ -517,6 +517,12 @@ Res WriteF_firstformat_v(mps_lib_FILE *stream,
517 if (res != ResOK) return res; 517 if (res != ResOK) return res;
518 } break; 518 } break;
519 519
520 case '3': { /* decimal for thousandths */
521 WriteFU u = va_arg(args, WriteFU);
522 res = WriteWord(stream, (Word)u, 10, 3);
523 if (res != ResOK) return res;
524 } break;
525
520 case 'B': { /* binary, see .writef.p */ 526 case 'B': { /* binary, see .writef.p */
521 WriteFB b = va_arg(args, WriteFB); 527 WriteFB b = va_arg(args, WriteFB);
522 res = WriteWord(stream, (Word)b, 2, sizeof(WriteFB) * CHAR_BIT); 528 res = WriteWord(stream, (Word)b, 2, sizeof(WriteFB) * CHAR_BIT);
diff --git a/mps/code/zcoll.c b/mps/code/zcoll.c
index aa2f5f9f26c..879a35eb29d 100644
--- a/mps/code/zcoll.c
+++ b/mps/code/zcoll.c
@@ -847,15 +847,31 @@ int main(int argc, char **argv)
847 /* Try 10MB arena */ 847 /* Try 10MB arena */
848 /* testscriptA("Arena(size 10485760), Make(keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect."); */ 848 /* testscriptA("Arena(size 10485760), Make(keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect."); */
849 if(1) { 849 if(1) {
850 testscriptA("Arena(size 10485760), " 850 testscriptA("Arena(size 10000000), "
851 "ZRndStateSet(239185672), "
852 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, " 851 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
853 "Rootdrop(rank E), StackScan(0), Collect, Collect, StackScan(1), " 852 "Rootdrop(rank E), StackScan(0), Collect, Collect, StackScan(1), "
854 "ZRndStateSet(239185672), "
855 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, " 853 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
856 "Rootdrop(rank E), Collect, Collect."); 854 "Rootdrop(rank E), Collect, Collect.");
857 } 855 }
858 if(0) { 856 if(1) {
857 testscriptA("Arena(size 4000000), "
858 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
859 "Rootdrop(rank E), StackScan(0), Collect, Collect, StackScan(1), "
860 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
861 "Rootdrop(rank E), Collect, Collect.");
862 }
863 if(1) {
864 testscriptA("Arena(size 4000000), "
865 "Make(random 1, keep-1-in 5, keep 10000, rootspace 30000, sizemethod 1), "
866 "Rootdrop(rank E), Collect, "
867 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), "
868 "Rootdrop(rank E), Collect, "
869 "Make(random 1, keep-1-in 5, keep 100000, rootspace 30000, sizemethod 1), "
870 "Rootdrop(rank E), Collect, "
871 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), "
872 "Rootdrop(rank E), Collect.");
873 }
874 if(1) {
859 testscriptA("Arena(size 10485760), " 875 testscriptA("Arena(size 10485760), "
860 "Make(random 0, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 2), " 876 "Make(random 0, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 2), "
861 "Collect, " 877 "Collect, "
@@ -864,6 +880,15 @@ int main(int argc, char **argv)
864 "Collect, " 880 "Collect, "
865 "Rootdrop(rank E), Collect, Collect."); 881 "Rootdrop(rank E), Collect, Collect.");
866 } 882 }
883 if(1) {
884 testscriptA("Arena(size 10485760), "
885 "ZRndStateSet(239185672), "
886 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
887 "Rootdrop(rank E), StackScan(0), Collect, Collect, StackScan(1), "
888 "ZRndStateSet(239185672), "
889 "Make(random 1, keep-1-in 5, keep 50000, rootspace 30000, sizemethod 1), Collect, "
890 "Rootdrop(rank E), Collect, Collect.");
891 }
867 892
868 /* LSP -- Large Segment Padding (job001811) 893 /* LSP -- Large Segment Padding (job001811)
869 * 894 *