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