Skip to content

Commit b51885a

Browse files
committed
TmpString use thread_local instead of lock
Signed-off-by: James Cherry <[email protected]>
1 parent cb6922d commit b51885a

File tree

4 files changed

+26
-57
lines changed

4 files changed

+26
-57
lines changed

include/sta/StringUtil.hh

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,6 @@ stringPrintTmp(const char *fmt,
177177

178178
char *
179179
makeTmpString(size_t length);
180-
void
181-
initTmpStrings();
182-
void
183-
deleteTmpStrings();
184180
bool
185181
isTmpString(const char *str);
186182

network/Network.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ Network::pathName(const Instance *instance) const
258258
const Instance *inst = path_iter1.next();
259259
name_length += strlen(name(inst)) + 1;
260260
}
261-
char *path_name = makeTmpString(name_length);
261+
char *path_name = makeTmpString(name_length + 1);
262262
char *path_ptr = path_name;
263263
// Top instance has null string name, so terminate the string here.
264264
*path_name = '\0';

search/Sta.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ initSta()
225225
initElapsedTime();
226226
TimingRole::init();
227227
PortDirection::init();
228-
initTmpStrings();
229228
initLiberty();
230229
initDelayConstants();
231230
registerDelayCalcs();
@@ -244,7 +243,6 @@ deleteAllMemory()
244243
Sta::setSta(nullptr);
245244
}
246245
deleteDelayCalcs();
247-
deleteTmpStrings();
248246
TimingRole::destroy();
249247
PortDirection::destroy();
250248
deleteLiberty();

util/StringUtil.cc

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
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

189162
static void
190163
getTmpString(// 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

202178
char *
203179
makeTmpString(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)
230205
bool
231206
isTmpString(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

Comments
 (0)