summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/SimpleTest/MemoryStats.js
blob: 2af971184c087d99ffbe90e4fea796e3d6f63c9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* -*- js-indent-level: 4; indent-tabs-mode: nil -*- */
/* vim:set ts=4 sw=4 sts=4 et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

var MemoryStats = {};

/**
 * Statistics that we want to retrieve and display after every test is
 * done.  The keys of this table are intended to be identical to the
 * relevant attributes of nsIMemoryReporterManager.  However, since
 * nsIMemoryReporterManager doesn't necessarily support all these
 * statistics in all build configurations, we also use this table to
 * tell us whether statistics are supported or not.
 */
var MEM_STAT_UNKNOWN = 0;
var MEM_STAT_UNSUPPORTED = 1;
var MEM_STAT_SUPPORTED = 2;

MemoryStats._hasMemoryStatistics = {}
MemoryStats._hasMemoryStatistics.vsize = MEM_STAT_UNKNOWN;
MemoryStats._hasMemoryStatistics.vsizeMaxContiguous = MEM_STAT_UNKNOWN;
MemoryStats._hasMemoryStatistics.residentFast = MEM_STAT_UNKNOWN;
MemoryStats._hasMemoryStatistics.heapAllocated = MEM_STAT_UNKNOWN;

MemoryStats._getService = function (className, interfaceName) {
    var service;
    try {
        service = Cc[className].getService(Ci[interfaceName]);
    } catch (e) {
        service = SpecialPowers.Cc[className]
                               .getService(SpecialPowers.Ci[interfaceName]);
    }
    return service;
}

MemoryStats._nsIFile = function (pathname) {
    var f;
    var contractID = "@mozilla.org/file/local;1";
    try {
        f = Cc[contractID].createInstance(Ci.nsIFile);
    } catch(e) {
        f = SpecialPowers.Cc[contractID].createInstance(SpecialPowers.Ci.nsIFile);
    }
    f.initWithPath(pathname);
    return f;
}

MemoryStats.constructPathname = function (directory, basename) {
    var d = MemoryStats._nsIFile(directory);
    d.append(basename);
    return d.path;
}

MemoryStats.dump = function (testNumber,
                             testURL,
                             dumpOutputDirectory,
                             dumpAboutMemory,
                             dumpDMD) {
    // Use dump because treeherder uses --quiet, which drops 'info'
    // from the structured logger.
    var info = function(message) {
        dump(message + "\n");
    };

    var mrm = MemoryStats._getService("@mozilla.org/memory-reporter-manager;1",
                                      "nsIMemoryReporterManager");
    var statMessage = "";
    for (var stat in MemoryStats._hasMemoryStatistics) {
        var supported = MemoryStats._hasMemoryStatistics[stat];
        var firstAccess = false;
        if (supported == MEM_STAT_UNKNOWN) {
            firstAccess = true;
            try {
                var value = mrm[stat];
                supported = MEM_STAT_SUPPORTED;
            } catch (e) {
                supported = MEM_STAT_UNSUPPORTED;
            }
            MemoryStats._hasMemoryStatistics[stat] = supported;
        }
        if (supported == MEM_STAT_SUPPORTED) {
            var sizeInMB = Math.round(mrm[stat] / (1024 * 1024));
            statMessage += " | " + stat + " " + sizeInMB + "MB";
        } else if (firstAccess) {
            info("MEMORY STAT " + stat + " not supported in this build configuration.");
        }
    }
    if (statMessage.length > 0) {
        info("MEMORY STAT" + statMessage);
    }

    if (dumpAboutMemory) {
        var basename = "about-memory-" + testNumber + ".json.gz";
        var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
                                                     basename);
        info(testURL + " | MEMDUMP-START " + dumpfile);
        var md = MemoryStats._getService("@mozilla.org/memory-info-dumper;1",
                                         "nsIMemoryInfoDumper");
        md.dumpMemoryReportsToNamedFile(dumpfile, function () {
            info("TEST-INFO | " + testURL + " | MEMDUMP-END");
        }, null, /* anonymize = */ false);
    }

    // This is the old, deprecated function.
    if (dumpDMD && typeof(DMDReportAndDump) != undefined) {
        var basename = "dmd-" + testNumber + "-deprecated.txt";
        var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
                                                     basename);
        info(testURL + " | DMD-DUMP-deprecated " + dumpfile);
        DMDReportAndDump(dumpfile);
    }

    if (dumpDMD && typeof(DMDAnalyzeReports) != undefined) {
        var basename = "dmd-" + testNumber + ".txt";
        var dumpfile = MemoryStats.constructPathname(dumpOutputDirectory,
                                                     basename);
        info(testURL + " | DMD-DUMP " + dumpfile);
        DMDAnalyzeReports(dumpfile);
    }
};