Bug 1080291 (part 2) - Remove thrashview.cpp. r=dbaron.
authorNicholas Nethercote <nnethercote@mozilla.com>
Sun, 12 Oct 2014 17:29:10 -0700
changeset 210046 90c895fa9a9da2d9a7afceef4c6e5fd70ed0318d
parent 210045 0913bc62172b7b6c6ebf1fb46cae79ef969195c6
child 210047 19a3b5083aaa874c76dfd575cdd4fd8dbe2a580b
push id50322
push usernnethercote@mozilla.com
push dateMon, 13 Oct 2014 00:33:44 +0000
treeherdermozilla-inbound@43f4a2c51d8a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdbaron
bugs1080291
milestone35.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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