deps: patch V8 to 7.4.288.21 · nodejs/node@7f29117 (original) (raw)

`@@ -129,7 +129,8 @@ class CompilationStateImpl {

`

129

129

`void SetNumberOfFunctionsToCompile(int num_functions);

`

130

130

``

131

131

`// Add the callback function to be called on compilation events. Needs to be

`

132

``

`-

// set before {AddCompilationUnits} is run.

`

``

132

`+

// set before {AddCompilationUnits} is run to ensure that it receives all

`

``

133

`+

// events. The callback object must support being deleted from any thread.

`

133

134

`void AddCallback(CompilationState::callback_t);

`

134

135

``

135

136

`// Inserts new functions to compile and kicks off compilation.

`

`@@ -153,7 +154,7 @@ class CompilationStateImpl {

`

153

154

` }

`

154

155

``

155

156

`bool baseline_compilation_finished() const {

`

156

``

`-

base::MutexGuard guard(&mutex_);

`

``

157

`+

base::MutexGuard guard(&callbacks_mutex_);

`

157

158

`return outstanding_baseline_units_ == 0 ||

`

158

159

` (compile_mode_ == CompileMode::kTiering &&

`

159

160

` outstanding_tiering_units_ == 0);

`

`@@ -203,8 +204,6 @@ class CompilationStateImpl {

`

203

204

` : func_index(func_index), error(std::move(error)) {}

`

204

205

` };

`

205

206

``

206

``

`-

void NotifyOnEvent(CompilationEvent event);

`

207

``

-

208

207

` NativeModule* const native_module_;

`

209

208

`const std::shared_ptr background_compile_token_;

`

210

209

`const CompileMode compile_mode_;

`

`@@ -236,16 +235,26 @@ class CompilationStateImpl {

`

236

235

`// compiling.

`

237

236

` std::shared_ptr wire_bytes_storage_;

`

238

237

``

239

``

`-

int outstanding_baseline_units_ = 0;

`

240

``

`-

int outstanding_tiering_units_ = 0;

`

241

``

-

242

238

`// End of fields protected by {mutex_}.

`

243

239

`//////////////////////////////////////////////////////////////////////////////

`

244

240

``

245

``

`-

// Callback functions to be called on compilation events. Only accessible from

`

246

``

`-

// the foreground thread.

`

``

241

`+

// This mutex protects the callbacks vector, and the counters used to

`

``

242

`+

// determine which callbacks to call. The counters plus the callbacks

`

``

243

`+

// themselves need to be synchronized to ensure correct order of events.

`

``

244

`+

mutable base::Mutex callbacks_mutex_;

`

``

245

+

``

246

`+

//////////////////////////////////////////////////////////////////////////////

`

``

247

`+

// Protected by {callbacks_mutex_}:

`

``

248

+

``

249

`+

// Callback functions to be called on compilation events.

`

247

250

` std::vectorCompilationState::callback_t callbacks_;

`

248

251

``

``

252

`+

int outstanding_baseline_units_ = 0;

`

``

253

`+

int outstanding_tiering_units_ = 0;

`

``

254

+

``

255

`+

// End of fields protected by {callbacks_mutex_}.

`

``

256

`+

//////////////////////////////////////////////////////////////////////////////

`

``

257

+

249

258

`const int max_background_tasks_ = 0;

`

250

259

`};

`

251

260

``

`@@ -852,6 +861,7 @@ std::shared_ptr AsyncCompileJob::CreateStreamingDecoder() {

`

852

861

`}

`

853

862

``

854

863

`AsyncCompileJob::~AsyncCompileJob() {

`

``

864

`+

// Note: This destructor always runs on the foreground thread of the isolate.

`

855

865

` background_task_manager_.CancelAndWait();

`

856

866

`// If the runtime objects were not created yet, then initial compilation did

`

857

867

`// not finish yet. In this case we can abort compilation.

`

`@@ -1473,12 +1483,13 @@ CompilationStateImpl::~CompilationStateImpl() {

`

1473

1483

`void CompilationStateImpl::AbortCompilation() {

`

1474

1484

` background_compile_token_->Cancel();

`

1475

1485

`// No more callbacks after abort.

`

``

1486

`+

base::MutexGuard callbacks_guard(&callbacks_mutex_);

`

1476

1487

` callbacks_.clear();

`

1477

1488

`}

`

1478

1489

``

1479

1490

`void CompilationStateImpl::SetNumberOfFunctionsToCompile(int num_functions) {

`

1480

1491

`DCHECK(!failed());

`

1481

``

`-

base::MutexGuard guard(&mutex_);

`

``

1492

`+

base::MutexGuard guard(&callbacks_mutex_);

`

1482

1493

` outstanding_baseline_units_ = num_functions;

`

1483

1494

``

1484

1495

`if (compile_mode_ == CompileMode::kTiering) {

`

`@@ -1487,6 +1498,7 @@ void CompilationStateImpl::SetNumberOfFunctionsToCompile(int num_functions) {

`

1487

1498

`}

`

1488

1499

``

1489

1500

`void CompilationStateImpl::AddCallback(CompilationState::callback_t callback) {

`

``

1501

`+

base::MutexGuard callbacks_guard(&callbacks_mutex_);

`

1490

1502

` callbacks_.emplace_back(std::move(callback));

`

1491

1503

`}

`

1492

1504

``

`@@ -1536,7 +1548,7 @@ CompilationStateImpl::GetNextCompilationUnit() {

`

1536

1548

``

1537

1549

`void CompilationStateImpl::OnFinishedUnit(ExecutionTier tier, WasmCode* code) {

`

1538

1550

`// This mutex guarantees that events happen in the right order.

`

1539

``

`-

base::MutexGuard guard(&mutex_);

`

``

1551

`+

base::MutexGuard guard(&callbacks_mutex_);

`

1540

1552

``

1541

1553

`// If we are not compiling in tiering mode, then all units are counted as

`

1542

1554

`// baseline units.

`

`@@ -1547,28 +1559,36 @@ void CompilationStateImpl::OnFinishedUnit(ExecutionTier tier, WasmCode* code) {

`

1547

1559

`// tiering units.

`

1548

1560

`DCHECK_IMPLIES(!is_tiering_mode, outstanding_tiering_units_ == 0);

`

1549

1561

``

``

1562

`+

bool baseline_finished = false;

`

``

1563

`+

bool tiering_finished = false;

`

1550

1564

`if (is_tiering_unit) {

`

1551

1565

`DCHECK_LT(0, outstanding_tiering_units_);

`

1552

1566

` --outstanding_tiering_units_;

`

1553

``

`-

if (outstanding_tiering_units_ == 0) {

`

1554

``

`-

// If baseline compilation has not finished yet, then also trigger

`

1555

``

`-

// {kFinishedBaselineCompilation}.

`

1556

``

`-

if (outstanding_baseline_units_ > 0) {

`

1557

``

`-

NotifyOnEvent(CompilationEvent::kFinishedBaselineCompilation);

`

1558

``

`-

}

`

1559

``

`-

NotifyOnEvent(CompilationEvent::kFinishedTopTierCompilation);

`

1560

``

`-

}

`

``

1567

`+

tiering_finished = outstanding_tiering_units_ == 0;

`

``

1568

`+

// If baseline compilation has not finished yet, then also trigger

`

``

1569

`+

// {kFinishedBaselineCompilation}.

`

``

1570

`+

baseline_finished = tiering_finished && outstanding_baseline_units_ > 0;

`

1561

1571

` } else {

`

1562

1572

`DCHECK_LT(0, outstanding_baseline_units_);

`

1563

1573

` --outstanding_baseline_units_;

`

1564

``

`-

if (outstanding_baseline_units_ == 0) {

`

1565

``

`-

NotifyOnEvent(CompilationEvent::kFinishedBaselineCompilation);

`

1566

``

`-

// If we are not tiering, then we also trigger the "top tier finished"

`

1567

``

`-

// event when baseline compilation is finished.

`

1568

``

`-

if (!is_tiering_mode) {

`

1569

``

`-

NotifyOnEvent(CompilationEvent::kFinishedTopTierCompilation);

`

1570

``

`-

}

`

1571

``

`-

}

`

``

1574

`+

// If we are in tiering mode and tiering finished before, then do not

`

``

1575

`+

// trigger baseline finished.

`

``

1576

`+

baseline_finished = outstanding_baseline_units_ == 0 &&

`

``

1577

`+

(!is_tiering_mode || outstanding_tiering_units_ > 0);

`

``

1578

`+

// If we are not tiering, then we also trigger the "top tier finished"

`

``

1579

`+

// event when baseline compilation is finished.

`

``

1580

`+

tiering_finished = baseline_finished && !is_tiering_mode;

`

``

1581

`+

}

`

``

1582

+

``

1583

`+

if (baseline_finished) {

`

``

1584

`+

for (auto& callback : callbacks_)

`

``

1585

`+

callback(CompilationEvent::kFinishedBaselineCompilation);

`

``

1586

`+

}

`

``

1587

`+

if (tiering_finished) {

`

``

1588

`+

for (auto& callback : callbacks_)

`

``

1589

`+

callback(CompilationEvent::kFinishedTopTierCompilation);

`

``

1590

`+

// Clear the callbacks because no more events will be delivered.

`

``

1591

`+

callbacks_.clear();

`

1572

1592

` }

`

1573

1593

``

1574

1594

`if (code != nullptr) native_module_->engine()->LogCode(code);

`

`@@ -1648,17 +1668,12 @@ void CompilationStateImpl::SetError(uint32_t func_index,

`

1648

1668

`if (!set) return;

`

1649

1669

`// If set successfully, give up ownership.

`

1650

1670

` compile_error.release();

`

1651

``

`-

// Schedule a foreground task to call the callback and notify users about the

`

1652

``

`-

// compile error.

`

1653

``

`-

NotifyOnEvent(CompilationEvent::kFailedCompilation);

`

1654

``

`-

}

`

1655

``

-

1656

``

`-

void CompilationStateImpl::NotifyOnEvent(CompilationEvent event) {

`

1657

``

`-

for (auto& callback : callbacks_) callback(event);

`

1658

``

`-

// If no more events are expected after this one, clear the callbacks to free

`

1659

``

`-

// memory. We can safely do this here, as this method is only called from

`

1660

``

`-

// foreground tasks.

`

1661

``

`-

if (event >= CompilationEvent::kFirstFinalEvent) callbacks_.clear();

`

``

1671

`+

base::MutexGuard callbacks_guard(&callbacks_mutex_);

`

``

1672

`+

for (auto& callback : callbacks_) {

`

``

1673

`+

callback(CompilationEvent::kFailedCompilation);

`

``

1674

`+

}

`

``

1675

`+

// No more callbacks after an error.

`

``

1676

`+

callbacks_.clear();

`

1662

1677

`}

`

1663

1678

``

1664

1679

`void CompileJsToWasmWrappers(Isolate* isolate, const WasmModule* module,

`