8
8
9
9
#include < fstream> // NOLINT(readability/streams)
10
10
#include < sstream>
11
+ #include < unordered_map>
11
12
12
13
#include " src/api.h"
13
14
#include " src/assembler-inl.h"
@@ -136,8 +137,6 @@ void ThreadLocalTop::Free() {
136
137
base::Thread::LocalStorageKey Isolate::isolate_key_;
137
138
base::Thread::LocalStorageKey Isolate::thread_id_key_;
138
139
base::Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_;
139
- base::LazyMutex Isolate::thread_data_table_mutex_ = LAZY_MUTEX_INITIALIZER;
140
- Isolate::ThreadDataTable* Isolate::thread_data_table_ = nullptr ;
141
140
base::Atomic32 Isolate::isolate_counter_ = 0 ;
142
141
#if DEBUG
143
142
base::Atomic32 Isolate::isolate_key_created_ = 0 ;
@@ -148,13 +147,13 @@ Isolate::PerIsolateThreadData*
148
147
ThreadId thread_id = ThreadId::Current ();
149
148
PerIsolateThreadData* per_thread = nullptr ;
150
149
{
151
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_. Pointer () );
152
- per_thread = thread_data_table_-> Lookup (this , thread_id);
150
+ base::LockGuard<base::Mutex> lock_guard (& thread_data_table_mutex_);
151
+ per_thread = thread_data_table_. Lookup (thread_id);
153
152
if (per_thread == nullptr ) {
154
153
per_thread = new PerIsolateThreadData (this , thread_id);
155
- thread_data_table_-> Insert (per_thread);
154
+ thread_data_table_. Insert (per_thread);
156
155
}
157
- DCHECK (thread_data_table_-> Lookup (this , thread_id) == per_thread);
156
+ DCHECK (thread_data_table_. Lookup (thread_id) == per_thread);
158
157
}
159
158
return per_thread;
160
159
}
@@ -165,12 +164,11 @@ void Isolate::DiscardPerThreadDataForThisThread() {
165
164
if (thread_id_int) {
166
165
ThreadId thread_id = ThreadId (thread_id_int);
167
166
DCHECK (!thread_manager_->mutex_owner_ .Equals (thread_id));
168
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_.Pointer ());
169
- PerIsolateThreadData* per_thread =
170
- thread_data_table_->Lookup (this , thread_id);
167
+ base::LockGuard<base::Mutex> lock_guard (&thread_data_table_mutex_);
168
+ PerIsolateThreadData* per_thread = thread_data_table_.Lookup (thread_id);
171
169
if (per_thread) {
172
170
DCHECK (!per_thread->thread_state_ );
173
- thread_data_table_-> Remove (per_thread);
171
+ thread_data_table_. Remove (per_thread);
174
172
}
175
173
}
176
174
}
@@ -186,23 +184,20 @@ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread(
186
184
ThreadId thread_id) {
187
185
PerIsolateThreadData* per_thread = nullptr ;
188
186
{
189
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_. Pointer () );
190
- per_thread = thread_data_table_-> Lookup (this , thread_id);
187
+ base::LockGuard<base::Mutex> lock_guard (& thread_data_table_mutex_);
188
+ per_thread = thread_data_table_. Lookup (thread_id);
191
189
}
192
190
return per_thread;
193
191
}
194
192
195
193
196
194
void Isolate::InitializeOncePerProcess () {
197
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_.Pointer ());
198
- CHECK_NULL (thread_data_table_);
199
195
isolate_key_ = base::Thread::CreateThreadLocalKey ();
200
196
#if DEBUG
201
197
base::Relaxed_Store (&isolate_key_created_, 1 );
202
198
#endif
203
199
thread_id_key_ = base::Thread::CreateThreadLocalKey ();
204
200
per_isolate_thread_data_key_ = base::Thread::CreateThreadLocalKey ();
205
- thread_data_table_ = new Isolate::ThreadDataTable ();
206
201
}
207
202
208
203
Address Isolate::get_address_from_id (IsolateAddressId id) {
@@ -2240,14 +2235,9 @@ char* Isolate::RestoreThread(char* from) {
2240
2235
return from + sizeof (ThreadLocalTop);
2241
2236
}
2242
2237
2243
- Isolate::ThreadDataTable::ThreadDataTable () : list_ ( nullptr ) {}
2238
+ Isolate::ThreadDataTable::ThreadDataTable () : table_ ( ) {}
2244
2239
2245
- Isolate::ThreadDataTable::~ThreadDataTable () {
2246
- // TODO(svenpanne) The assertion below would fire if an embedder does not
2247
- // cleanly dispose all Isolates before disposing v8, so we are conservative
2248
- // and leave it out for now.
2249
- // DCHECK_NULL(list_);
2250
- }
2240
+ Isolate::ThreadDataTable::~ThreadDataTable () {}
2251
2241
2252
2242
void Isolate::ReleaseManagedObjects () {
2253
2243
Isolate::ManagedObjectFinalizer* current =
@@ -2294,40 +2284,30 @@ Isolate::PerIsolateThreadData::~PerIsolateThreadData() {
2294
2284
#endif
2295
2285
}
2296
2286
2297
-
2298
- Isolate::PerIsolateThreadData*
2299
- Isolate::ThreadDataTable::Lookup (Isolate* isolate,
2300
- ThreadId thread_id) {
2301
- for (PerIsolateThreadData* data = list_; data != nullptr ;
2302
- data = data->next_ ) {
2303
- if (data->Matches (isolate, thread_id)) return data;
2304
- }
2305
- return nullptr ;
2287
+ Isolate::PerIsolateThreadData* Isolate::ThreadDataTable::Lookup (
2288
+ ThreadId thread_id) {
2289
+ auto t = table_.find (thread_id);
2290
+ if (t == table_.end ()) return nullptr ;
2291
+ return t->second ;
2306
2292
}
2307
2293
2308
2294
2309
2295
void Isolate::ThreadDataTable::Insert (Isolate::PerIsolateThreadData* data) {
2310
- if (list_ != nullptr ) list_->prev_ = data;
2311
- data->next_ = list_;
2312
- list_ = data;
2296
+ bool inserted = table_.insert (std::make_pair (data->thread_id_ , data)).second ;
2297
+ CHECK (inserted);
2313
2298
}
2314
2299
2315
2300
2316
2301
void Isolate::ThreadDataTable::Remove (PerIsolateThreadData* data) {
2317
- if (list_ == data) list_ = data->next_ ;
2318
- if (data->next_ != nullptr ) data->next_ ->prev_ = data->prev_ ;
2319
- if (data->prev_ != nullptr ) data->prev_ ->next_ = data->next_ ;
2302
+ table_.erase (data->thread_id_ );
2320
2303
delete data;
2321
2304
}
2322
2305
2323
-
2324
- void Isolate::ThreadDataTable::RemoveAllThreads (Isolate* isolate) {
2325
- PerIsolateThreadData* data = list_;
2326
- while (data != nullptr ) {
2327
- PerIsolateThreadData* next = data->next_ ;
2328
- if (data->isolate () == isolate) Remove (data);
2329
- data = next;
2306
+ void Isolate::ThreadDataTable::RemoveAllThreads () {
2307
+ for (auto & x : table_) {
2308
+ delete x.second ;
2330
2309
}
2310
+ table_.clear ();
2331
2311
}
2332
2312
2333
2313
@@ -2502,10 +2482,6 @@ Isolate::Isolate(bool enable_serializer)
2502
2482
cancelable_task_manager_(new CancelableTaskManager()),
2503
2483
abort_on_uncaught_exception_callback_(nullptr ),
2504
2484
total_regexp_code_generated_(0 ) {
2505
- {
2506
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_.Pointer ());
2507
- CHECK (thread_data_table_);
2508
- }
2509
2485
id_ = base::Relaxed_AtomicIncrement (&isolate_counter_, 1 );
2510
2486
TRACE_ISOLATE (constructor);
2511
2487
@@ -2563,8 +2539,8 @@ void Isolate::TearDown() {
2563
2539
Deinit ();
2564
2540
2565
2541
{
2566
- base::LockGuard<base::Mutex> lock_guard (thread_data_table_mutex_. Pointer () );
2567
- thread_data_table_-> RemoveAllThreads (this );
2542
+ base::LockGuard<base::Mutex> lock_guard (& thread_data_table_mutex_);
2543
+ thread_data_table_. RemoveAllThreads ();
2568
2544
}
2569
2545
2570
2546
#ifdef DEBUG
@@ -2578,12 +2554,6 @@ void Isolate::TearDown() {
2578
2554
}
2579
2555
2580
2556
2581
- void Isolate::GlobalTearDown () {
2582
- delete thread_data_table_;
2583
- thread_data_table_ = nullptr ;
2584
- }
2585
-
2586
-
2587
2557
void Isolate::ClearSerializerData () {
2588
2558
delete external_reference_table_;
2589
2559
external_reference_table_ = nullptr ;
0 commit comments