/src/aspell/common/objstack.cpp
Line | Count | Source |
1 | | |
2 | | #include "objstack.hpp" |
3 | | |
4 | | namespace acommon { |
5 | | |
6 | | void ObjStack::setup_chunk() |
7 | 524k | { |
8 | 524k | bottom = first_free->data; |
9 | 524k | align_bottom(min_align); |
10 | 524k | top = (byte *)first_free + chunk_size; |
11 | 524k | align_top(min_align); |
12 | 524k | } |
13 | | |
14 | | |
15 | | ObjStack::ObjStack(size_t chunk_s, size_t align) |
16 | 51.1k | : chunk_size(chunk_s), min_align(align), temp_end(0) |
17 | 51.1k | { |
18 | 51.1k | first_free = first = (Node *)malloc(chunk_size); |
19 | 51.1k | first->next = 0; |
20 | 51.1k | reserve = 0; |
21 | 51.1k | setup_chunk(); |
22 | 51.1k | } |
23 | | |
24 | | ObjStack::~ObjStack() |
25 | 50.9k | { |
26 | 104k | while (first) { |
27 | 53.8k | Node * tmp = first->next; |
28 | 53.8k | free(first); |
29 | 53.8k | first = tmp; |
30 | 53.8k | } |
31 | 50.9k | trim(); |
32 | 50.9k | } |
33 | | |
34 | | size_t ObjStack::calc_size() |
35 | 0 | { |
36 | 0 | size_t size = 0; |
37 | 0 | for (Node * p = first; p; p = p->next) |
38 | 0 | size += chunk_size; |
39 | 0 | return size; |
40 | 0 | } |
41 | | |
42 | | void ObjStack::new_chunk() |
43 | 176k | { |
44 | 176k | if (reserve) { |
45 | 45.2k | first_free->next = reserve; |
46 | 45.2k | reserve = reserve->next; |
47 | 45.2k | first_free = first_free->next; |
48 | 45.2k | first_free->next = 0; |
49 | 130k | } else { |
50 | 130k | first_free->next = (Node *)malloc(chunk_size); |
51 | 130k | first_free = first_free->next; |
52 | 130k | } |
53 | 176k | first_free->next = 0; |
54 | 176k | setup_chunk(); |
55 | 176k | } |
56 | | |
57 | | void ObjStack::reset() |
58 | 296k | { |
59 | 296k | assert(first_free->next == 0); |
60 | 296k | if (first->next) { |
61 | 3.80k | first_free->next = reserve; |
62 | 3.80k | reserve = first->next; |
63 | 3.80k | first->next = 0; |
64 | 3.80k | } |
65 | 296k | first_free = first; |
66 | 296k | setup_chunk(); |
67 | 296k | } |
68 | | |
69 | | void ObjStack::trim() |
70 | 62.2k | { |
71 | 70.9k | while (reserve) { |
72 | 8.63k | Node * tmp = reserve->next; |
73 | 8.63k | free(reserve); |
74 | 8.63k | reserve = tmp; |
75 | 8.63k | } |
76 | 62.2k | } |
77 | | |
78 | 11.3k | ObjStack::Memory * ObjStack::freeze() { |
79 | 11.3k | trim(); |
80 | 11.3k | Node * tmp = first; |
81 | 11.3k | first = 0; |
82 | 11.3k | first_free = 0; |
83 | 11.3k | top = 0; |
84 | 11.3k | bottom = 0; |
85 | 11.3k | temp_end = 0; |
86 | 11.3k | return tmp; |
87 | 11.3k | } |
88 | | |
89 | 11.3k | void ObjStack::dealloc(Memory * ptr) { |
90 | 130k | while (ptr) { |
91 | 119k | Node * tmp = ptr->next; |
92 | 119k | free(ptr); |
93 | 119k | ptr = tmp; |
94 | 119k | } |
95 | 11.3k | } |
96 | | |
97 | | } |