linux/tools/perf/util/pstack.c
<<
>>
Prefs
   1/*
   2 * Simple pointer stack
   3 *
   4 * (c) 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
   5 */
   6
   7#include "util.h"
   8#include "pstack.h"
   9#include <linux/kernel.h>
  10#include <stdlib.h>
  11
  12struct pstack {
  13        unsigned short  top;
  14        unsigned short  max_nr_entries;
  15        void            *entries[0];
  16};
  17
  18struct pstack *pstack__new(unsigned short max_nr_entries)
  19{
  20        struct pstack *self = zalloc((sizeof(*self) +
  21                                     max_nr_entries * sizeof(void *)));
  22        if (self != NULL)
  23                self->max_nr_entries = max_nr_entries;
  24        return self;
  25}
  26
  27void pstack__delete(struct pstack *self)
  28{
  29        free(self);
  30}
  31
  32bool pstack__empty(const struct pstack *self)
  33{
  34        return self->top == 0;
  35}
  36
  37void pstack__remove(struct pstack *self, void *key)
  38{
  39        unsigned short i = self->top, last_index = self->top - 1;
  40
  41        while (i-- != 0) {
  42                if (self->entries[i] == key) {
  43                        if (i < last_index)
  44                                memmove(self->entries + i,
  45                                        self->entries + i + 1,
  46                                        (last_index - i) * sizeof(void *));
  47                        --self->top;
  48                        return;
  49                }
  50        }
  51        pr_err("%s: %p not on the pstack!\n", __func__, key);
  52}
  53
  54void pstack__push(struct pstack *self, void *key)
  55{
  56        if (self->top == self->max_nr_entries) {
  57                pr_err("%s: top=%d, overflow!\n", __func__, self->top);
  58                return;
  59        }
  60        self->entries[self->top++] = key;
  61}
  62
  63void *pstack__pop(struct pstack *self)
  64{
  65        void *ret;
  66
  67        if (self->top == 0) {
  68                pr_err("%s: underflow!\n", __func__);
  69                return NULL;
  70        }
  71
  72        ret = self->entries[--self->top];
  73        self->entries[self->top] = NULL;
  74        return ret;
  75}
  76