1919#include < limits>
2020#include < cctype>
2121#include < cstdio>
22+ #include < array>
2223
2324#include " Machine.hh"
2425#include " Mutex.hh"
@@ -152,69 +153,43 @@ stringPrintTmp(const char *fmt,
152153
153154// //////////////////////////////////////////////////////////////
154155
155- static int tmp_string_count_ = 100 ;
156- static char **tmp_strings_ = nullptr ;
157- static size_t *tmp_string_lengths_ = nullptr ;
158- static int tmp_string_next_;
159- static std::mutex string_lock_;
160-
161- void
162- initTmpStrings ()
163- {
164- size_t initial_length = 100 ;
165-
166- tmp_strings_ = new char *[tmp_string_count_];
167- tmp_string_lengths_ = new size_t [tmp_string_count_];
168- for (int i = 0 ; i < tmp_string_count_; i++) {
169- tmp_strings_[i] = new char [initial_length];
170- tmp_string_lengths_[i] = initial_length;
171- }
172- tmp_string_next_ = 0 ;
173- }
174-
175- void
176- deleteTmpStrings ()
177- {
178- if (tmp_strings_) {
179- for (int i = 0 ; i < tmp_string_count_; i++)
180- delete [] tmp_strings_[i];
181- delete [] tmp_strings_;
182- tmp_strings_ = nullptr ;
183-
184- delete [] tmp_string_lengths_;
185- tmp_string_lengths_ = nullptr ;
186- }
187- }
156+ static constexpr size_t tmp_string_count = 256 ;
157+ static constexpr size_t tmp_string_initial_length = 256 ;
158+ thread_local static std::array<char *, tmp_string_count> tmp_strings;
159+ thread_local static std::array<size_t , tmp_string_count> tmp_string_lengths;
160+ thread_local static int tmp_string_next = 0 ;
188161
189162static void
190163getTmpString (// Return values.
191164 char *&str,
192165 size_t &length)
193166{
194- LockGuard lock (string_lock_);
195- if (tmp_string_next_ == tmp_string_count_)
196- tmp_string_next_ = 0 ;
197- str = tmp_strings_[tmp_string_next_];
198- length = tmp_string_lengths_[tmp_string_next_];
199- tmp_string_next_++;
167+ if (tmp_string_next == tmp_string_count)
168+ tmp_string_next = 0 ;
169+ str = tmp_strings[tmp_string_next];
170+ length = tmp_string_lengths[tmp_string_next];
171+ if (str == nullptr ) {
172+ str = tmp_strings[tmp_string_next] = new char [tmp_string_initial_length];
173+ length = tmp_string_lengths[tmp_string_next] = tmp_string_initial_length;
174+ }
175+ tmp_string_next++;
200176}
201177
202178char *
203179makeTmpString (size_t length)
204180{
205- LockGuard lock (string_lock_);
206- if (tmp_string_next_ == tmp_string_count_)
207- tmp_string_next_ = 0 ;
208- char *tmp_str = tmp_strings_[tmp_string_next_];
209- size_t tmp_length = tmp_string_lengths_[tmp_string_next_];
181+ if (tmp_string_next == tmp_string_count)
182+ tmp_string_next = 0 ;
183+ char *tmp_str = tmp_strings[tmp_string_next];
184+ size_t tmp_length = tmp_string_lengths[tmp_string_next];
210185 if (tmp_length < length) {
211186 // String isn't long enough. Make a new one.
212187 delete [] tmp_str;
213188 tmp_str = new char [length];
214- tmp_strings_[tmp_string_next_ ] = tmp_str;
215- tmp_string_lengths_[tmp_string_next_ ] = length;
189+ tmp_strings[tmp_string_next ] = tmp_str;
190+ tmp_string_lengths[tmp_string_next ] = length;
216191 }
217- tmp_string_next_ ++;
192+ tmp_string_next ++;
218193 return tmp_str;
219194}
220195
@@ -230,9 +205,9 @@ stringDeleteCheck(const char *str)
230205bool
231206isTmpString (const char *str)
232207{
233- if (tmp_strings_ ) {
234- for (int i = 0 ; i < tmp_string_count_ ; i++) {
235- if (str == tmp_strings_ [i])
208+ if (!tmp_strings. empty () ) {
209+ for (size_t i = 0 ; i < tmp_string_count ; i++) {
210+ if (str == tmp_strings [i])
236211 return true ;
237212 }
238213 }
0 commit comments