/src/aspell/common/objstack.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | #include "objstack.hpp" |
3 | | |
4 | | namespace acommon { |
5 | | |
6 | | void ObjStack::setup_chunk() |
7 | 592k | { |
8 | 592k | bottom = first_free->data; |
9 | 592k | align_bottom(min_align); |
10 | 592k | top = (byte *)first_free + chunk_size; |
11 | 592k | align_top(min_align); |
12 | 592k | } |
13 | | |
14 | | |
15 | | ObjStack::ObjStack(size_t chunk_s, size_t align) |
16 | 25.5k | : chunk_size(chunk_s), min_align(align), temp_end(0) |
17 | 25.5k | { |
18 | 25.5k | first_free = first = (Node *)malloc(chunk_size); |
19 | 25.5k | first->next = 0; |
20 | 25.5k | reserve = 0; |
21 | 25.5k | setup_chunk(); |
22 | 25.5k | } |
23 | | |
24 | | ObjStack::~ObjStack() |
25 | 25.4k | { |
26 | 45.2k | while (first) { |
27 | 19.8k | Node * tmp = first->next; |
28 | 19.8k | free(first); |
29 | 19.8k | first = tmp; |
30 | 19.8k | } |
31 | 25.4k | trim(); |
32 | 25.4k | } |
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 | 194k | { |
44 | 194k | if (reserve) { |
45 | 52.9k | first_free->next = reserve; |
46 | 52.9k | reserve = reserve->next; |
47 | 52.9k | first_free = first_free->next; |
48 | 52.9k | first_free->next = 0; |
49 | 141k | } else { |
50 | 141k | first_free->next = (Node *)malloc(chunk_size); |
51 | 141k | first_free = first_free->next; |
52 | 141k | } |
53 | 194k | first_free->next = 0; |
54 | 194k | setup_chunk(); |
55 | 194k | } |
56 | | |
57 | | void ObjStack::reset() |
58 | 371k | { |
59 | 371k | assert(first_free->next == 0); |
60 | 371k | if (first->next) { |
61 | 4.75k | first_free->next = reserve; |
62 | 4.75k | reserve = first->next; |
63 | 4.75k | first->next = 0; |
64 | 4.75k | } |
65 | 371k | first_free = first; |
66 | 371k | setup_chunk(); |
67 | 371k | } |
68 | | |
69 | | void ObjStack::trim() |
70 | 34.6k | { |
71 | 43.1k | while (reserve) { |
72 | 8.56k | Node * tmp = reserve->next; |
73 | 8.56k | free(reserve); |
74 | 8.56k | reserve = tmp; |
75 | 8.56k | } |
76 | 34.6k | } |
77 | | |
78 | 9.15k | ObjStack::Memory * ObjStack::freeze() { |
79 | 9.15k | trim(); |
80 | 9.15k | Node * tmp = first; |
81 | 9.15k | first = 0; |
82 | 9.15k | first_free = 0; |
83 | 9.15k | top = 0; |
84 | 9.15k | bottom = 0; |
85 | 9.15k | temp_end = 0; |
86 | 9.15k | return tmp; |
87 | 9.15k | } |
88 | | |
89 | 9.15k | void ObjStack::dealloc(Memory * ptr) { |
90 | 148k | while (ptr) { |
91 | 138k | Node * tmp = ptr->next; |
92 | 138k | free(ptr); |
93 | 138k | ptr = tmp; |
94 | 138k | } |
95 | 9.15k | } |
96 | | |
97 | | } |