Commit ea513ab8 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

Revert "[wasm] Decouple background compile jobs from NativeModule"

This reverts commit 92d9b09c.

Reason for revert: Crashes on several bots, e.g. https://ci.chromium.org/p/v8/builders/luci.v8.ci/V8%20Linux64%20UBSan/4237

Original change's description:
> [wasm] Decouple background compile jobs from NativeModule
> 
> Background compile jobs should not keep the NativeModule alive, for two
> reasons:
> 1) We sometimes have to wait for background compilation to finish (from
>    a foreground task!). This introduces unnecessary latency.
> 2) Giving the background compile tasks shared ownership of the
>    NativeModule causes the NativeModule (and the CompilationState) to
>    be freed from background tasks, which is error-prone (see
>    https://crrev.com/c/1400420).
> 
> Instead, this CL introduces a BackgroundCompileToken which is held
> alive by the NativeModule and all background compile jobs. The initial
> and the final phase of compilation (getting and submitting work)
> synchronize on this token to check and ensure that the NativeModule is
> and stays alive. During compilation itself, the mutex is released, such
> that the NativeModule can die.
> The destructor of the NativeModule cancels the BackgroundCompileToken.
> Immediately afterwards, the NativeModule and the CompilationState can
> die.
> 
> This change allows to remove two hacks introduced previously: The atomic
> {aborted_} flag and the {FreeCallbacksTask}.
> 
> R=​mstarzinger@chromium.org
> CC=​titzer@chromium.org
> 
> Bug: v8:8689, v8:7921
> Change-Id: I42e06eab3c944b0988286f2ce18e3c294535dfb6
> Cq-Include-Trybots: luci.v8.try:v8_linux64_tsan_rel
> Reviewed-on: https://chromium-review.googlesource.com/c/1421364
> Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#59020}

TBR=mstarzinger@chromium.org,clemensh@chromium.org

Change-Id: I724f460f5aa654a9e75d3ce73d351214e69e2d96
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: v8:8689, v8:7921
Cq-Include-Trybots: luci.v8.try:v8_linux64_tsan_rel
Reviewed-on: https://chromium-review.googlesource.com/c/1429861Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59022}
parent 5a88e710
...@@ -48,10 +48,10 @@ bool V8::Initialize() { ...@@ -48,10 +48,10 @@ bool V8::Initialize() {
void V8::TearDown() { void V8::TearDown() {
wasm::WasmEngine::GlobalTearDown();
#if defined(USE_SIMULATOR) #if defined(USE_SIMULATOR)
Simulator::GlobalTearDown(); Simulator::GlobalTearDown();
#endif #endif
wasm::WasmEngine::GlobalTearDown();
CallDescriptors::TearDown(); CallDescriptors::TearDown();
Bootstrapper::TearDownExtensions(); Bootstrapper::TearDownExtensions();
ElementsAccessor::TearDown(); ElementsAccessor::TearDown();
......
...@@ -15,7 +15,6 @@ namespace internal { ...@@ -15,7 +15,6 @@ namespace internal {
namespace wasm { namespace wasm {
class NativeModule; class NativeModule;
class WasmCode;
class WasmError; class WasmError;
enum RuntimeExceptionSupport : bool { enum RuntimeExceptionSupport : bool {
...@@ -113,8 +112,6 @@ class CompilationState { ...@@ -113,8 +112,6 @@ class CompilationState {
bool failed() const; bool failed() const;
void OnFinishedUnit(ExecutionTier, WasmCode*);
private: private:
friend class NativeModule; friend class NativeModule;
friend class WasmCompilationUnit; friend class WasmCompilationUnit;
......
This diff is collapsed.
...@@ -30,6 +30,7 @@ namespace wasm { ...@@ -30,6 +30,7 @@ namespace wasm {
class NativeModule; class NativeModule;
class WasmCodeManager; class WasmCodeManager;
class WasmEngine;
class WasmMemoryTracker; class WasmMemoryTracker;
class WasmImportWrapperCache; class WasmImportWrapperCache;
struct WasmModule; struct WasmModule;
...@@ -325,9 +326,8 @@ class V8_EXPORT_PRIVATE NativeModule final { ...@@ -325,9 +326,8 @@ class V8_EXPORT_PRIVATE NativeModule final {
CompilationState* compilation_state() { return compilation_state_.get(); } CompilationState* compilation_state() { return compilation_state_.get(); }
// Create a {CompilationEnv} object for compilation. The caller has to ensure // Create a {CompilationEnv} object for compilation. Only valid as long as
// that the {WasmModule} pointer stays valid while the {CompilationEnv} is // this {NativeModule} is alive.
// being used.
CompilationEnv CreateCompilationEnv() const; CompilationEnv CreateCompilationEnv() const;
uint32_t num_functions() const { uint32_t num_functions() const {
...@@ -341,7 +341,6 @@ class V8_EXPORT_PRIVATE NativeModule final { ...@@ -341,7 +341,6 @@ class V8_EXPORT_PRIVATE NativeModule final {
bool lazy_compile_frozen() const { return lazy_compile_frozen_; } bool lazy_compile_frozen() const { return lazy_compile_frozen_; }
Vector<const uint8_t> wire_bytes() const { return wire_bytes_->as_vector(); } Vector<const uint8_t> wire_bytes() const { return wire_bytes_->as_vector(); }
const WasmModule* module() const { return module_.get(); } const WasmModule* module() const { return module_.get(); }
std::shared_ptr<const WasmModule> shared_module() const { return module_; }
size_t committed_code_space() const { return committed_code_space_.load(); } size_t committed_code_space() const { return committed_code_space_.load(); }
void SetWireBytes(OwnedVector<const uint8_t> wire_bytes); void SetWireBytes(OwnedVector<const uint8_t> wire_bytes);
...@@ -424,8 +423,8 @@ class V8_EXPORT_PRIVATE NativeModule final { ...@@ -424,8 +423,8 @@ class V8_EXPORT_PRIVATE NativeModule final {
// to be consistent across asynchronous compilations later. // to be consistent across asynchronous compilations later.
const WasmFeatures enabled_features_; const WasmFeatures enabled_features_;
// The decoded module, stored in a shared_ptr such that background compile // TODO(clemensh): Make this a unique_ptr (requires refactoring
// tasks can keep this alive. // AsyncCompileJob).
std::shared_ptr<const WasmModule> module_; std::shared_ptr<const WasmModule> module_;
// Wire bytes, held in a shared_ptr so they can be kept alive by the // Wire bytes, held in a shared_ptr so they can be kept alive by the
......
...@@ -25,8 +25,6 @@ WasmEngine::WasmEngine() ...@@ -25,8 +25,6 @@ WasmEngine::WasmEngine()
: code_manager_(&memory_tracker_, FLAG_wasm_max_code_space * MB) {} : code_manager_(&memory_tracker_, FLAG_wasm_max_code_space * MB) {}
WasmEngine::~WasmEngine() { WasmEngine::~WasmEngine() {
// Synchronize on all background compile tasks.
background_compile_task_manager_.CancelAndWait();
// All AsyncCompileJobs have been canceled. // All AsyncCompileJobs have been canceled.
DCHECK(jobs_.empty()); DCHECK(jobs_.empty());
// All Isolates have been deregistered. // All Isolates have been deregistered.
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <memory> #include <memory>
#include <unordered_set> #include <unordered_set>
#include "src/cancelable-task.h"
#include "src/wasm/wasm-code-manager.h" #include "src/wasm/wasm-code-manager.h"
#include "src/wasm/wasm-memory.h" #include "src/wasm/wasm-memory.h"
#include "src/wasm/wasm-tier.h" #include "src/wasm/wasm-tier.h"
...@@ -155,12 +154,6 @@ class V8_EXPORT_PRIVATE WasmEngine { ...@@ -155,12 +154,6 @@ class V8_EXPORT_PRIVATE WasmEngine {
// engines this might be a pointer to a new instance or to a shared one. // engines this might be a pointer to a new instance or to a shared one.
static std::shared_ptr<WasmEngine> GetWasmEngine(); static std::shared_ptr<WasmEngine> GetWasmEngine();
template <typename T, typename... Args>
std::unique_ptr<T> NewBackgroundCompileTask(Args&&... args) {
return base::make_unique<T>(&background_compile_task_manager_,
std::forward<Args>(args)...);
}
private: private:
AsyncCompileJob* CreateAsyncCompileJob( AsyncCompileJob* CreateAsyncCompileJob(
Isolate* isolate, const WasmFeatures& enabled, Isolate* isolate, const WasmFeatures& enabled,
...@@ -172,10 +165,6 @@ class V8_EXPORT_PRIVATE WasmEngine { ...@@ -172,10 +165,6 @@ class V8_EXPORT_PRIVATE WasmEngine {
WasmCodeManager code_manager_; WasmCodeManager code_manager_;
AccountingAllocator allocator_; AccountingAllocator allocator_;
// Task manager managing all background compile jobs. Before shut down of the
// engine, they must all be finished because they access the allocator.
CancelableTaskManager background_compile_task_manager_;
// This mutex protects all information which is mutated concurrently or // This mutex protects all information which is mutated concurrently or
// fields that are initialized lazily on the first access. // fields that are initialized lazily on the first access.
base::Mutex mutex_; base::Mutex mutex_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment