/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <assert.h>
#include <dirent.h>
#include <errno.h>
#include <getopt.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#include <pagemap/pagemap.h>

#define MAX_CMDLINE 256

struct process_info {
    pid_t pid;
    char cmdline[MAX_CMDLINE];
};

struct mapping_info {
    struct process_info *proc;
    pm_memusage_t usage;
};

struct library_info {
    struct library_info *next;
    char *name;
    struct mapping_info **mappings;
    size_t mappings_count;
    size_t mappings_size;
    pm_memusage_t total_usage;
};

static void usage(char *myname);
static int getprocname(pid_t pid, char *buf, size_t len);
static int numcmp(long long a, long long b);
static int licmp(const void *a, const void *b);

char *library_name_blacklist[] = { "[heap]", "[stack]", "", NULL };

#define declare_sort(field) \
    static int sort_by_ ## field (const void *a, const void *b)

declare_sort(vss);
declare_sort(rss);
declare_sort(pss);
declare_sort(uss);
declare_sort(swap);

#define INIT_LIBRARIES 16
#define INIT_MAPPINGS 4

static int order;

struct library_info **libraries;
size_t libraries_count;
size_t libraries_size;

struct library_info *get_library(const char *name, bool all) {
    size_t i;
    struct library_info *library;

    if (!all) {
        for (i = 0; library_name_blacklist[i]; i++)
            if (!strcmp(name, library_name_blacklist[i]))
                return NULL;
    } else {
        if (name[0] == 0) {
            name = "[anon]";
        }
    }

    for (i = 0; i < libraries_count; i++) {
        if (!strcmp(libraries[i]->name, name))
            return libraries[i];
    }

    if (libraries_size && libraries_count >= libraries_size) {
        libraries = realloc(libraries, 2 * libraries_size * sizeof(struct library_info *));
        if (!libraries) {
            fprintf(stderr, "Couldn't resize libraries array: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        libraries_size = 2 * libraries_size;
    }

    library = calloc(1, sizeof(*library));
    if (!library) {
        fprintf(stderr, "Couldn't allocate space for library struct: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    library->name = malloc(strlen(name) + 1);
    if (!library->name) {
        fprintf(stderr, "Couldn't allocate space for library name: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    strcpy(library->name, name);
    library->mappings = malloc(INIT_MAPPINGS * sizeof(struct mapping_info *));
    if (!library->mappings) {
        fprintf(stderr, "Couldn't allocate space for library mappings array: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    library->mappings_count = 0; library->mappings_size = INIT_MAPPINGS;
    pm_memusage_zero(&library->total_usage);

    libraries[libraries_count++] = library;

    return library;
}

struct mapping_info *get_mapping(struct library_info *library, struct process_info *proc) {
    struct mapping_info *mapping;
    size_t i;

    for (i = 0; i < library->mappings_count; i++) {
        if (library->mappings[i]->proc == proc)
            return library->mappings[i];
    }

    if (library->mappings_size && library->mappings_count >= library->mappings_size) {
        library->mappings = realloc(library->mappings,
            2 * library->mappings_size * sizeof(struct mapping_info*));
        if (!library->mappings) {
            fprintf(stderr, "Couldn't resize mappings array: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        library->mappings_size = 2 * library->mappings_size;
    }

    mapping = calloc(1, sizeof(*mapping));
    if (!mapping) {
        fprintf(stderr, "Couldn't allocate space for mapping struct: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    mapping->proc = proc;
    pm_memusage_zero(&mapping->usage);

    library->mappings[library->mappings_count++] = mapping;

    return mapping;
}

struct process_info *get_process(pid_t pid) {
    struct process_info *process;

    process = calloc(1, sizeof(*process));
    if (!process) {
        fprintf(stderr, "Couldn't allocate space for process struct: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    process->pid = pid;
    getprocname(pid, process->cmdline, sizeof(process->cmdline));

    return process;
}

static int parse_perm(const char *perm)
{
    int ret = 0;

    while (*perm) {
        switch(*perm) {
        case 'r':
            ret |= PM_MAP_READ;
            break;
        case 'w':
            ret |= PM_MAP_WRITE;
            break;
        case 'x':
            ret |= PM_MAP_EXEC;
            break;
        default:
            fprintf(stderr, "Unknown permission '%c'\n", *perm);
            exit(EXIT_FAILURE);
        }
        perm++;
    }
    return ret;
}

int main(int argc, char *argv[]) {
    char *prefix;
    size_t prefix_len;
    int (*compfn)(const void *a, const void *b);

    pm_kernel_t *ker;
    pm_process_t *proc;

    pid_t *pids;
    size_t num_procs;

    pm_map_t **maps;
    size_t num_maps;
    pm_memusage_t map_usage;

    struct library_info *li;
    struct mapping_info *mi;
    struct process_info *pi;

    size_t i, j;
    int error;
    int perm;
    bool all;
    uint64_t required_flags;
    uint64_t flags_mask;

    bool has_swap = false;

    signal(SIGPIPE, SIG_IGN);
    compfn = &sort_by_pss;
    order = -1;
    prefix = NULL;
    prefix_len = 0;
    opterr = 0;
    perm = 0;
    all = false;
    required_flags = 0;
    flags_mask = 0;

    while (1) {
        int c;
        const struct option longopts[] = {
            {"all", 0, 0, 'a'},
            {"cached", 0, 0, 'c'},
            {"nocached", 0, 0, 'C'},
            {"ksm", 0, 0, 'k'},
            {"help", 0, 0, 'h'},
            {"pss", 0, 0, 'p'},
            {"uss", 0, 0, 'u'},
            {"vss", 0, 0, 'v'},
            {"rss", 0, 0, 'r'},
            {"swap", 0, 0, 's'},
            {"reverse", 0, 0, 'R'},
            {"path", required_argument, 0, 'P'},
            {"perm", required_argument, 0, 'm'},
            {0, 0, 0, 0}
        };
        c = getopt_long(argc, argv, "acChkm:pP:uvrsR", longopts, NULL);
        if (c < 0) {
            break;
        }
        /* Alphabetical cases */
        switch (c) {
        case 'a':
            all = true;
            break;
        case 'c':
            required_flags = 0;
            flags_mask = KPF_SWAPBACKED;
            break;
        case 'C':
            required_flags = KPF_SWAPBACKED;
            flags_mask = KPF_SWAPBACKED;
            break;
        case 'k':
            required_flags = KPF_KSM;
            flags_mask = KPF_KSM;
            break;
        case 'h':
            usage(argv[0]);
            exit(EXIT_SUCCESS);
        case 'm':
            perm = parse_perm(optarg);
            break;
        case 'p':
            compfn = &sort_by_pss;
            break;
        case 'P':
            prefix = optarg;
            prefix_len = strlen(prefix);
            break;
        case 'u':
            compfn = &sort_by_uss;
            break;
        case 'v':
            compfn = &sort_by_vss;
            break;
        case 'r':
            compfn = &sort_by_rss;
            break;
        case 's':
            compfn = &sort_by_swap;
            break;
        case 'R':
            order *= -1;
            break;
        case '?':
            fprintf(stderr, "Invalid argument \"%s\".\n", argv[optind - 1]);
            usage(argv[0]);
            exit(EXIT_FAILURE);
        default:
            abort();
        }
    }

    argc -= optind;
    argv += optind;

    libraries = malloc(INIT_LIBRARIES * sizeof(struct library_info *));
    libraries_count = 0; libraries_size = INIT_LIBRARIES;
    pm_memusage_zero(&map_usage);

    error = pm_kernel_create(&ker);
    if (error) {
        fprintf(stderr, "Error initializing kernel interface -- "
                        "does this kernel have pagemap?\n");
        exit(EXIT_FAILURE);
    }

    error = pm_kernel_pids(ker, &pids, &num_procs);
    if (error) {
        fprintf(stderr, "Error listing processes.\n");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < num_procs; i++) {
        error = pm_process_create(ker, pids[i], &proc);
        if (error) {
            fprintf(stderr, "warning: could not create process interface for %d\n", pids[i]);
            continue;
        }

        pi = get_process(pids[i]);

        error = pm_process_maps(proc, &maps, &num_maps);
        if (error) {
            fprintf(stderr, "Error listing maps for process %d.\n", proc->pid);
            exit(EXIT_FAILURE);
        }

        for (j = 0; j < num_maps; j++) {
            if (prefix && (strncmp(pm_map_name(maps[j]), prefix, prefix_len)))
                continue;

            if (perm && (pm_map_flags(maps[j]) & PM_MAP_PERMISSIONS) != perm)
                continue;

            li = get_library(pm_map_name(maps[j]), all);
            if (!li)
                continue;

            mi = get_mapping(li, pi);

            error = pm_map_usage_flags(maps[j], &map_usage, flags_mask,
                                       required_flags);
            if (error) {
                fprintf(stderr, "Error getting map memory usage of "
                                "map %s in process %d.\n",
                        pm_map_name(maps[j]), proc->pid);
                exit(EXIT_FAILURE);
            }

            if (map_usage.swap) {
                has_swap = true;
            }

            pm_memusage_add(&mi->usage, &map_usage);
            pm_memusage_add(&li->total_usage, &map_usage);
        }
    }

    printf(" %6s   %7s   %6s   %6s   %6s  ", "RSStot", "VSS", "RSS", "PSS", "USS");

    if (has_swap) {
        printf(" %6s  ", "Swap");
    }

    printf("Name/PID\n");
    fflush(stdout);

    qsort(libraries, libraries_count, sizeof(libraries[0]), &licmp);

    for (i = 0; i < libraries_count; i++) {
        li = libraries[i];

        printf("%6zdK   %7s   %6s   %6s   %6s  ", li->total_usage.pss / 1024, "", "", "", "");
        if (has_swap) {
            printf(" %6s  ", "");
        }
        printf("%s\n", li->name);
        fflush(stdout);

        qsort(li->mappings, li->mappings_count, sizeof(li->mappings[0]), compfn);

        for (j = 0; j < li->mappings_count; j++) {
            mi = li->mappings[j];
            pi = mi->proc;
            printf(   " %6s  %7zdK  %6zdK  %6zdK  %6zdK  ", "",
                mi->usage.vss / 1024,
                mi->usage.rss / 1024,
                mi->usage.pss / 1024,
                mi->usage.uss / 1024);
            if (has_swap) {
                printf("%6zdK  ", mi->usage.swap / 1024);
            }
            printf("  %s [%d]\n",
                pi->cmdline,
                pi->pid);
        }
        printf("\n");
        fflush(stdout);
    }

    exit(0);
}

static void usage(char *myname) {
    fprintf(stderr, "Usage: %s [ -P | -L ] [ -v | -r | -p | -u | -s | -h ]\n"
                    "\n"
                    "Sort options:\n"
                    "    -v  Sort processes by VSS.\n"
                    "    -r  Sort processes by RSS.\n"
                    "    -p  Sort processes by PSS.\n"
                    "    -u  Sort processes by USS.\n"
                    "    -s  Sort processes by swap.\n"
                    "        (Default sort order is PSS.)\n"
                    "    -a  Show all mappings, including stack, heap and anon.\n"
                    "    -P /path  Limit libraries displayed to those in path.\n"
                    "    -R  Reverse sort order (default is descending).\n"
                    "    -m [r][w][x] Only list pages that exactly match permissions\n"
                    "    -c  Only show cached (storage backed) pages\n"
                    "    -C  Only show non-cached (ram/swap backed) pages\n"
                    "    -k  Only show pages collapsed by KSM\n"
                    "    -h  Display this help screen.\n",
    myname);
}

static int getprocname(pid_t pid, char *buf, size_t len) {
    char filename[32];
    FILE *f;

    snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid);
    f = fopen(filename, "r");
    if (!f) {
        *buf = '\0';
        return 1;
    }
    if (!fgets(buf, len, f)) {
        *buf = '\0';
        fclose(f);
        return 2;
    }
    fclose(f);
    return 0;
}

static int numcmp(long long a, long long b) {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}

static int licmp(const void *a, const void *b) {
    return order * numcmp(
        (*((struct library_info**)a))->total_usage.pss,
        (*((struct library_info**)b))->total_usage.pss
    );
}

#define create_sort(field, compfn) \
    static int sort_by_ ## field (const void *a, const void *b) { \
        return order * compfn( \
            (*((struct mapping_info**)a))->usage.field, \
            (*((struct mapping_info**)b))->usage.field \
        ); \
    }

create_sort(vss, numcmp)
create_sort(rss, numcmp)
create_sort(pss, numcmp)
create_sort(uss, numcmp)
create_sort(swap, numcmp)
