@@ -85,7 +85,6 @@ class Pool {
8585 int is_valid_ptr (void * v) const ;
8686
8787 private:
88- void grow_internal (long count);
8988 T* allocate_pool (long count);
9089 void deallocate_pool (T* p);
9190
@@ -96,8 +95,6 @@ class Pool {
9695 long pool_size_{};
9796 long count_{};
9897 long subcount_{1 };
99- long get_{};
100- long put_{};
10198 long nget_{};
10299 long total_allocs_{};
103100 Pool* chain_{};
@@ -126,7 +123,7 @@ Pool<T, Mutex>::Pool(long count, long subcount)
126123 pool_size_ = count_;
127124 freelist_.reserve (count_);
128125 for (long i = 0 ; i < count_; ++i) {
129- freelist_[i] = pool_ + i * subcount_;
126+ freelist_. push_back ( pool_ + i * subcount_) ;
130127 }
131128}
132129
@@ -138,35 +135,24 @@ Pool<T, Mutex>::~Pool() {
138135
139136template <typename T, bool Mutex>
140137void Pool<T, Mutex>::grow(long count) {
141- grow_internal (count);
142- put_ = get_;
143- }
144-
145- template <typename T, bool Mutex>
146- void Pool<T, Mutex>::grow_internal(long count) {
147- assert (get_ == put_);
148138 Pool* p = new Pool (count, subcount_);
149139 chainlast_->chain_ = p;
150140 chainlast_ = p;
151141
152- // Insert new items at the get_ position, shifting the rest right
153- std::vector<T*> new_freelist (count);
154142 for (long j = 0 ; j < count; ++j) {
155- new_freelist[j] = p->pool_ + j * subcount_;
143+ freelist_. push_back ( p->pool_ + j * subcount_) ;
156144 }
157- freelist_.insert (freelist_.begin () + get_, new_freelist.begin (), new_freelist.end ());
158- put_ += count;
159145 count_ += count;
160146}
161147
162148template <typename T, bool Mutex>
163149T* Pool<T, Mutex>::alloc() {
164150 std::lock_guard<mutex_type> lock (mut_);
165- if (nget_ >= count_ ) {
166- grow_internal (count_ );
151+ if (freelist_. empty () ) {
152+ grow (freelist_. capacity () );
167153 }
168- T* item = freelist_[get_] ;
169- get_ = (get_ + 1 ) % count_ ;
154+ T* item = freelist_. back () ;
155+ freelist_. pop_back () ;
170156 ++nget_;
171157 ++total_allocs_;
172158 return item;
@@ -176,8 +162,7 @@ template <typename T, bool Mutex>
176162void Pool<T, Mutex>::hpfree(T* item) {
177163 std::lock_guard<mutex_type> lock (mut_);
178164 assert (nget_ > 0 );
179- freelist_[put_] = item;
180- put_ = (put_ + 1 ) % count_;
165+ freelist_.push_back (item);
181166 --nget_;
182167}
183168
@@ -186,18 +171,14 @@ void Pool<T, Mutex>::free_all() {
186171 std::lock_guard<mutex_type> lock (mut_);
187172 Pool* pp;
188173 nget_ = 0 ;
189- get_ = 0 ;
190- put_ = 0 ;
191174 for (pp = this ; pp; pp = pp->chain_ ) {
192175 for (long i = 0 ; i < pp->pool_size_ ; ++i) {
193- freelist_[put_++] = pp->pool_ + i * subcount_;
176+ freelist_. push_back ( pp->pool_ + i * subcount_) ;
194177 if constexpr (pool_has_clear<T>::value) {
195178 (pp->pool_ + i * subcount_)->clear ();
196179 }
197180 }
198181 }
199- assert (put_ == count_);
200- put_ = 0 ;
201182}
202183
203184template <typename T, bool Mutex>
0 commit comments