@@ -140,10 +140,10 @@ class WorkerThreadData { |
140 | 140 | uv_err_name_r(ret, err_buf, sizeof(err_buf)); |
141 | 141 | w->custom_error_ = "ERR_WORKER_INIT_FAILED"; |
142 | 142 | w->custom_error_str_ = err_buf; |
143 | | - w->loop_init_failed_ = true; |
144 | 143 | w->stopped_ = true; |
145 | 144 | return; |
146 | 145 | } |
| 146 | + loop_init_failed_ = false; |
147 | 147 |
|
148 | 148 | std::shared_ptr<ArrayBufferAllocator> allocator = |
149 | 149 | ArrayBufferAllocator::Create(); |
@@ -199,6 +199,7 @@ class WorkerThreadData { |
199 | 199 | } |
200 | 200 |
|
201 | 201 | if (isolate != nullptr) { |
| 202 | + CHECK(!loop_init_failed_); |
202 | 203 | bool platform_finished = false; |
203 | 204 |
|
204 | 205 | isolate_data_.reset(); |
@@ -217,18 +218,20 @@ class WorkerThreadData { |
217 | 218 |
|
218 | 219 | // Wait until the platform has cleaned up all relevant resources. |
219 | 220 | while (!platform_finished) { |
220 | | - CHECK(!w_->loop_init_failed_); |
221 | 221 | uv_run(&loop_, UV_RUN_ONCE); |
222 | 222 | } |
223 | 223 | } |
224 | | - if (!w_->loop_init_failed_) { |
| 224 | + if (!loop_init_failed_) { |
225 | 225 | CheckedUvLoopClose(&loop_); |
226 | 226 | } |
227 | 227 | } |
228 | 228 |
|
| 229 | + bool loop_is_usable() const { return !loop_init_failed_; } |
| 230 | + |
229 | 231 | private: |
230 | 232 | Worker* const w_; |
231 | 233 | uv_loop_t loop_; |
| 234 | + bool loop_init_failed_ = true; |
232 | 235 | DeleteFnPtr<IsolateData, FreeIsolateData> isolate_data_; |
233 | 236 |
|
234 | 237 | friend class Worker; |
@@ -258,7 +261,7 @@ void Worker::Run() { |
258 | 261 |
|
259 | 262 | WorkerThreadData data(this); |
260 | 263 | if (isolate_ == nullptr) return; |
261 | | - CHECK(!data.w_->loop_init_failed_); |
| 264 | + CHECK(data.loop_is_usable()); |
262 | 265 |
|
263 | 266 | Debug(this, "Starting worker with id %llu", thread_id_); |
264 | 267 | { |
|