Import Debian changes 20180207-1
[hcoop/debian/mlton.git] / runtime / gc / done.c
1 /* Copyright (C) 2012,2017 Matthew Fluet.
2 * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
5 *
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
8 */
9
10 static void displayCol (FILE *out, size_t width, const char *s) {
11 size_t extra;
12 size_t i;
13 size_t len;
14
15 len = strlen (s);
16 if (len < width) {
17 extra = width - len;
18 for (i = 0; i < extra; i++)
19 fprintf (out, " ");
20 }
21 fprintf (out, "%s\t", s);
22 }
23
24 static void displayCollectionStats (FILE *out, const char *name, struct rusage *ru,
25 uintmax_t num, uintmax_t bytes) {
26 uintmax_t ms;
27
28 ms = rusageTime (ru);
29 fprintf (out, "%s", name);
30 displayCol (out, 7, uintmaxToCommaString (ms));
31 displayCol (out, 7, uintmaxToCommaString (num));
32 displayCol (out, 15, uintmaxToCommaString (bytes));
33 displayCol (out, 15,
34 (ms > 0)
35 ? uintmaxToCommaString ((uintmax_t)(1000.0 * (float)bytes/(float)ms))
36 : "-");
37 fprintf (out, "\n");
38 }
39
40 void GC_done (GC_state s) {
41 FILE *out;
42
43 enter (s);
44 minorGC (s);
45 out = s->controls.summaryFile;
46 if (s->controls.summary) {
47 struct rusage ru_total;
48 uintmax_t gcTime;
49 uintmax_t totalTime;
50
51 getrusage (RUSAGE_SELF, &ru_total);
52 totalTime = rusageTime (&ru_total);
53 gcTime = rusageTime (&s->cumulativeStatistics.ru_gc);
54 fprintf (out, "GC type\t\ttime ms\t number\t\t bytes\t bytes/sec\n");
55 fprintf (out, "-------------\t-------\t-------\t---------------\t---------------\n");
56 displayCollectionStats
57 (out, "copying\t\t",
58 &s->cumulativeStatistics.ru_gcCopying,
59 s->cumulativeStatistics.numCopyingGCs,
60 s->cumulativeStatistics.bytesCopied);
61 displayCollectionStats
62 (out, "mark-compact\t",
63 &s->cumulativeStatistics.ru_gcMarkCompact,
64 s->cumulativeStatistics.numMarkCompactGCs,
65 s->cumulativeStatistics.bytesMarkCompacted);
66 displayCollectionStats
67 (out, "minor\t\t",
68 &s->cumulativeStatistics.ru_gcMinor,
69 s->cumulativeStatistics.numMinorGCs,
70 s->cumulativeStatistics.bytesCopiedMinor);
71 fprintf (out, "total time: %s ms\n",
72 uintmaxToCommaString (totalTime));
73 fprintf (out, "total GC time: %s ms (%.1f%%)\n",
74 uintmaxToCommaString (gcTime),
75 (0 == totalTime)
76 ? 0.0
77 : 100.0 * ((double) gcTime) / (double)totalTime);
78 fprintf (out, "max pause time: %s ms\n",
79 uintmaxToCommaString (s->cumulativeStatistics.maxPauseTime));
80 fprintf (out, "total bytes allocated: %s bytes\n",
81 uintmaxToCommaString (s->cumulativeStatistics.bytesAllocated));
82 fprintf (out, "max bytes live: %s bytes\n",
83 uintmaxToCommaString (s->cumulativeStatistics.maxBytesLive));
84 fprintf (out, "max heap size: %s bytes\n",
85 uintmaxToCommaString (s->cumulativeStatistics.maxHeapSize));
86 fprintf (out, "max stack size: %s bytes\n",
87 uintmaxToCommaString (s->cumulativeStatistics.maxStackSize));
88 fprintf (out, "num cards marked: %s\n",
89 uintmaxToCommaString (s->cumulativeStatistics.numCardsMarked));
90 fprintf (out, "bytes scanned: %s bytes\n",
91 uintmaxToCommaString (s->cumulativeStatistics.bytesScannedMinor));
92 fprintf (out, "bytes hash consed: %s bytes\n",
93 uintmaxToCommaString (s->cumulativeStatistics.bytesHashConsed));
94 }
95 releaseHeap (s, &s->heap);
96 releaseHeap (s, &s->secondaryHeap);
97 }