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