diff options
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/arenavm.c | 56 | ||||
| -rw-r--r-- | mps/code/diag.c | 25 | ||||
| -rw-r--r-- | mps/code/mpm.c | 6 | ||||
| -rw-r--r-- | mps/code/zcoll.c | 33 |
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) | ||
| 1633 | DIAG_DECL( | ||
| 1634 | static Count M_whole(size_t bytes) | ||
| 1635 | { | ||
| 1636 | size_t M; /* MBs */ | ||
| 1637 | M = (bytes + (bThou / 2)) / bPerM; | ||
| 1638 | return M; | ||
| 1639 | } | ||
| 1640 | static 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 | |||
| 1622 | static void VMCompact(Arena arena, Trace trace) | 1650 | static 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 | ||
| 1662 | mps_res_t mps_arena_vm_growth(mps_arena_t mps_arena, | 1702 | mps_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 | ||
| 30 | struct RuleStruct RulesGlobal[] = { | 30 | struct RuleStruct RulesGlobal[] = { |
| 31 | { "-", "*", "*", "*" }, | ||
| 32 | { "+", "DiagFilter_Rules", "*", "*" }, | ||
| 33 | { "+", "VMCompact", "*", "*" }, | ||
| 34 | /* ----v---- always on please (RHSK) ----v---- */ | ||
| 35 | { "+", "traceSetSignalEmergency", "*", "*" }, | ||
| 36 | { NULL, "", "", "" } | ||
| 37 | }; | ||
| 38 | |||
| 39 | struct 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 | * |