Bug 1080291 (part 2) - Remove thrashview.cpp. r=dbaron.
authorNicholas Nethercote <nnethercote@mozilla.com>
Sun, 12 Oct 2014 17:29:10 -0700
changeset 225486 90c895fa9a9da2d9a7afceef4c6e5fd70ed0318d
parent 225485 0913bc62172b7b6c6ebf1fb46cae79ef969195c6
child 225487 19a3b5083aaa874c76dfd575cdd4fd8dbe2a580b
push id7107
push userraliiev@mozilla.com
push dateMon, 13 Oct 2014 17:43:31 +0000
treeherdermozilla-aurora@b4b34e0acc75 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdbaron
bugs1080291
milestone35.0a1
Bug 1080291 (part 2) - Remove thrashview.cpp. r=dbaron.
tools/footprint/thrashview.cpp
tools/footprint/thrashview.mk
deleted file mode 100644
--- a/tools/footprint/thrashview.cpp
+++ /dev/null
@@ -1,424 +0,0 @@
-/* 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/. */
-
-/*
- * ``thrashview'' is a program that reads a binary stream of addresses
- * from stdin and displays the pattern graphically in a window.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <X11/Xlib.h>
-#include <fstream>
-#include <getopt.h>
-
-#define GET_DISPLAY_FD(display_) ConnectionNumber(display_)
-
-static bool opt_working_set = false;
-static bool opt_fixed = false;
-
-static Display *display;
-static Window window;
-static GC gc;
-static XColor colors[256];
-const unsigned int cellsize = 4;
-static unsigned int width = 64 * cellsize;
-static unsigned int height = 64 * cellsize;
-
-#define PAGESIZE 4096
-#define MAXPAGES 4096  // should hold 16MB worth of code
-static unsigned int minpage = static_cast<unsigned int>(-1);
-static unsigned int maxpage = 0;
-static unsigned char pages[MAXPAGES];
-
-
-/**
- * Create a simple window and the X objects we'll need to talk with it.
- */
-static int
-init()
-{
-    display = XOpenDisplay(0);
-    if (! display)
-        return 0;
-
-    window =
-        XCreateSimpleWindow(display,
-                            RootWindow(display, 0),
-                            1, 1, width, height,
-                            0,
-                            BlackPixel(display, 0),
-                            BlackPixel(display, 0));
-
-    if (! window)
-        return 0;
-
-    gc = XCreateGC(display, window, 0, 0);
-    if (! gc)
-        return 0;
-
-    // Set up a grayscale
-    const unsigned int ncolors = sizeof colors / sizeof colors[0];
-    const unsigned short step = 65536 / ncolors;
-    unsigned short brightness = 0;
-
-    XColor *color = colors;
-    XColor *limit = colors + ncolors;
-    for (; color < limit; ++color, brightness += step) {
-        color->red   = brightness;
-        color->green = brightness;
-        color->blue  = brightness;
-        XAllocColor(display, DefaultColormap(display, 0), color);
-    }
-
-    // We want exposes and resizes.
-    XSelectInput(display, window, ExposureMask | StructureNotifyMask);
-
-    XMapWindow(display, window);
-    XFlush(display);
-
-    return 1;
-}
-
-/**
- * Age pages that haven't been recently touched.
- */
-static void
-decay()
-{
-    int ws_immediate = 0, ws_longterm = 0;
-
-    unsigned char *page = pages;
-    unsigned char *limit = pages + (maxpage - minpage) + 1;
-    for (; page < limit; ++page) {
-        if (opt_working_set) {
-            if (*page == 255)
-                ++ws_immediate;
-            if (*page)
-                ++ws_longterm;
-        }
-
-        if (*page) {
-            *page /= 8;
-            *page *= 7;
-        }
-    }
-
-    if (opt_working_set) {
-        dec(cout);
-        cout << "immediate: " << ws_immediate << " pages, ";
-        cout << "longterm: " << ws_longterm << " pages, ";
-        cout << "mapped: " << ((maxpage - minpage) + 1) << " pages";
-        cout << endl;
-    }
-}
-
-/**
- * Blast the state of our pages to the screen.
- */
-static int
-handle_expose(const XExposeEvent& event)
-{
-    //printf("handle_expose(%d, %d, %d, %d)\n", event.x, event.y, event.width, event.height);
-
-    int i = event.x / cellsize;
-    int imost = i + event.width / cellsize + 1;
-
-    int j = event.y / cellsize;
-    int jmost = j + event.height / cellsize + 1;
-
-    unsigned char *last_cell = pages + maxpage - minpage;
-    unsigned char *row = pages + j;
-    for (int y = j * cellsize, ymost = jmost * cellsize;
-         y < ymost;
-         y += cellsize, row += width / cellsize) {
-        unsigned char *cell = row + i;
-        for (int x = i * cellsize, xmost = imost * cellsize;
-             x < xmost;
-             x += cellsize, ++cell) {
-            unsigned int pixel = (cell <= last_cell) ? colors[*cell].pixel : colors[0].pixel;
-            XSetForeground(display, gc, pixel);
-            XFillRectangle(display, window, gc, x, y, cellsize - 1, cellsize - 1);
-        }
-    }
-
-    XFlush(display);
-
-    return 1;
-}
-
-/**
- * Invalidate the entire window.
- */
-static void
-invalidate_window()
-{
-    XExposeEvent event;
-    event.x = event.y = 0;
-    event.width = width;
-    event.height = height;
-
-    handle_expose(event);
-}
-
-/**
- * Handle a configure event.
- */
-static int
-handle_configure(const XConfigureEvent& event)
-{
-    //printf("handle_resize(%d, %d)\n", event.width, event.height);
-    width = event.width - event.width % cellsize;
-    height = event.height;
-    return 1;
-}
-
-/**
- * Filter to select any message.
- */
-static Bool
-any_event(Display *display, XEvent *event, XPointer arg)
-{
-    return 1;
-}
-
-/**
- * An X event occurred. Process it and flush the queue.
- */
-static int
-handle_xevents()
-{
-    int ok;
-    
-    XEvent event;
-    XNextEvent(display, &event);
-    do {
-        switch (event.type) {
-        case Expose:
-            ok = handle_expose(reinterpret_cast<const XExposeEvent&>(event));
-            break;
-
-        case ConfigureNotify:
-            ok = handle_configure(reinterpret_cast<const XConfigureEvent&>(event));
-            break;
-
-        default:
-            ok = 1;
-        }
-    } while (ok && XCheckIfEvent(display, &event, any_event, 0));
-
-    return ok;
-}
-
-/**
- * Read address data from stdin.
- */
-static int
-read_addrs()
-{
-    unsigned int buf[1024];
-    ssize_t count;
-    while ((count = read(0, buf, sizeof buf)) > 0) {
-        if (count % sizeof(unsigned int))
-            cerr << "truncating unaligned read" << endl;
-
-        count /= sizeof buf[0];
-
-        unsigned int *addr = reinterpret_cast<unsigned int *>(buf);
-        unsigned int *limit = addr + count;
-
-        for (; addr < limit; ++addr) {
-            // map the address to a page
-            unsigned int page = *addr / PAGESIZE;
-
-            // XXX Don't let stray addresses bring us down. Should
-            // really fix this by knowing what the ranges of addresses
-            // we ought to expect are (e.g., by reading the symtab)
-            if (maxpage && page > maxpage && page - maxpage > MAXPAGES)
-                continue;
-
-            if (! opt_fixed) {
-                // Potentially adjust minpage and maxpage to
-                // accomodate an out-of-bounds address.
-                if (page < minpage) {
-                    if (maxpage) {
-                        // everything needs to shift.
-                        unsigned int shift = minpage - page;
-                        memmove(pages + shift, pages, maxpage - minpage);
-                        memset(pages, 0, shift);
-                    }
-                    minpage = page;
-                }
-
-                if (page > maxpage)
-                    maxpage = page;
-            }
-
-            page -= minpage;
-            pages[page] = 255;
-        }
-    }
-
-    if (count < 0 && errno != EWOULDBLOCK) {
-        perror("read");
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Run the program
- */
-static void
-run()
-{
-    // We want non-blocking I/O on stdin so we can select on it.
-    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
-
-    // The last time we refreshed the window.
-    struct timeval last;
-    gettimeofday(&last, 0);
-
-    int ok;
-
-    do {
-        // Select on stdin and the connection to the X server.
-        fd_set fds;
-        FD_ZERO(&fds);
-        FD_SET(STDIN_FILENO, &fds);
-        FD_SET(GET_DISPLAY_FD(display), &fds);
-
-        struct timeval tv;
-        tv.tv_sec  = 1;
-        tv.tv_usec = 0;
-
-        ok = select(GET_DISPLAY_FD(display) + 1, &fds, 0, 0, &tv);
-        if (ok < 0)
-            break;
-
-        if (maxpage) {
-            // See if we've waited long enough to refresh the window.
-            struct timeval now;
-            gettimeofday(&now, 0);
-
-            if (now.tv_sec != last.tv_sec) {
-                // At least a second has gone by. Decay and refresh.
-                last = now;
-                decay();
-                invalidate_window();
-            }
-            else if (now.tv_usec - last.tv_usec > 100000) {
-                // At least 100msec have gone by. Refresh.
-                last.tv_usec = now.tv_usec;
-                invalidate_window();
-            }
-        }
-
-        // Now check for X events and input.
-        ok = 1;
-
-        if (FD_ISSET(GET_DISPLAY_FD(display), &fds))
-            ok = handle_xevents();
-
-        if (FD_ISSET(STDIN_FILENO, &fds))
-            ok = read_addrs();
-    } while (ok);
-}
-
-/**
- * Tear down our window and stuff.
- */
-static void
-finish()
-{
-    if (window) {
-        XUnmapWindow(display, window);
-        XDestroyWindow(display, window);
-    }
-
-    if (display)
-        XCloseDisplay(display);
-}
-
-static struct option opts[] = {
-    { "working-set", no_argument,       0, 'w' },
-    { "min",         required_argument, 0, 'm' },
-    { "size",        required_argument, 0, 's' },
-    { "max",         required_argument, 0, 'x' },
-    { 0,             0,                 0, 0   }
-};
-
-static void
-usage()
-{
-    cerr << "thrashview [--working-set] [--min=<min>] [--max=<max>] [--size=<size>]" << endl;
-}
-
-/**
- * Program starts here.
- */
-int
-main(int argc, char *argv[])
-{
-    int size = 0;
-
-    while (1) {
-        int option_index = 0;
-        int c = getopt_long(argc, argv, "wm:x:s:", opts, &option_index);
-
-        if (c < 0)
-            break;
-
-        switch (c) {
-        case 'w':
-            opt_working_set = true;
-            break;
-
-        case 'm':
-            minpage = strtol(optarg, 0, 0) / PAGESIZE;
-            opt_fixed = true;
-            break;
-
-        case 's':
-            size = strtol(optarg, 0, 0) / PAGESIZE;
-            break;
-
-        case 'x':
-            maxpage = strtol(optarg, 0, 0) / PAGESIZE;
-            opt_fixed = true;
-            break;
-
-        default:
-            usage();
-            return 1;
-        }
-    }
-
-    if (minpage && !maxpage) {
-        if (!size) {
-            cerr << argv[0] << ": minpage specified without maxpage or size" << endl;
-            return 1;
-        }
-
-        maxpage = minpage + size;
-    }
-
-    if (opt_fixed && minpage > maxpage) {
-        cerr << argv[0] << ": invalid page range" << endl;
-        return 1;
-    }
-
-    if (init())
-        run();
-
-    finish();
-
-    return 0;
-}
deleted file mode 100644
--- a/tools/footprint/thrashview.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-CXXFLAGS=-O2
-LDLIBS=-L/usr/X11R6/lib -lX11
-thrashview: thrashview.cpp