| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent ad7f3bc commit a12c407
7 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -36,6 +36,7 @@ | |||
| 36 | 36 | #include "node_binding.h" | |
| 37 | 37 | #include "node_external_reference.h" | |
| 38 | 38 | #include "node_main_instance.h" | |
| 39 | + #include "node_native_module.h" | ||
| 39 | 40 | #include "node_options.h" | |
| 40 | 41 | #include "node_perf_common.h" | |
| 41 | 42 | #include "node_snapshotable.h" | |
@@ -972,7 +973,6 @@ struct EnvSerializeInfo { | |||
| 972 | 973 | }; | |
| 973 | 974 | ||
| 974 | 975 | struct SnapshotData { | |
| 975 | - SnapshotData() { blob.data = nullptr; } | ||
| 976 | 976 | v8::StartupData blob; | |
| 977 | 977 | std::vector<size_t> isolate_data_indices; | |
| 978 | 978 | EnvSerializeInfo env_info; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1145,28 +1145,19 @@ int Start(int argc, char** argv) { | |||
| 1145 | 1145 | } | |
| 1146 | 1146 | ||
| 1147 | 1147 | { | |
| 1148 | - Isolate::CreateParams params; | ||
| 1149 | - const std::vector<size_t>* indices = nullptr; | ||
| 1150 | - const EnvSerializeInfo* env_info = nullptr; | ||
| 1151 | 1148 | bool use_node_snapshot = | |
| 1152 | 1149 | per_process::cli_options->per_isolate->node_snapshot; | |
| 1153 | - if (use_node_snapshot) { | ||
| 1154 | - v8::StartupData* blob = NodeMainInstance::GetEmbeddedSnapshotBlob(); | ||
| 1155 | - if (blob != nullptr) { | ||
| 1156 | - params.snapshot_blob = blob; | ||
| 1157 | - indices = NodeMainInstance::GetIsolateDataIndices(); | ||
| 1158 | - env_info = NodeMainInstance::GetEnvSerializeInfo(); | ||
| 1159 | - } | ||
| 1160 | - } | ||
| 1150 | + const SnapshotData* snapshot_data = | ||
| 1151 | + use_node_snapshot ? NodeMainInstance::GetEmbeddedSnapshotData() | ||
| 1152 | + : nullptr; | ||
| 1161 | 1153 | uv_loop_configure(uv_default_loop(), UV_METRICS_IDLE_TIME); | |
| 1162 | 1154 | ||
| 1163 | - NodeMainInstance main_instance(¶ms, | ||
| 1155 | + NodeMainInstance main_instance(snapshot_data, | ||
| 1164 | 1156 | uv_default_loop(), | |
| 1165 | 1157 | per_process::v8_platform.Platform(), | |
| 1166 | 1158 | result.args, | |
| 1167 | - result.exec_args, | ||
| 1168 | - indices); | ||
| 1169 | - result.exit_code = main_instance.Run(env_info); | ||
| 1159 | + result.exec_args); | ||
| 1160 | + result.exit_code = main_instance.Run(); | ||
| 1170 | 1161 | } | |
| 1171 | 1162 | ||
| 1172 | 1163 | TearDownOncePerProcess(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -36,8 +36,7 @@ NodeMainInstance::NodeMainInstance(Isolate* isolate, | |||
| 36 | 36 | isolate_(isolate), | |
| 37 | 37 | platform_(platform), | |
| 38 | 38 | isolate_data_(nullptr), | |
| 39 | - owns_isolate_(false), | ||
| 40 | - deserialize_mode_(false) { | ||
| 39 | + snapshot_data_(nullptr) { | ||
| 41 | 40 | isolate_data_ = | |
| 42 | 41 | std::make_unique<IsolateData>(isolate_, event_loop, platform, nullptr); | |
| 43 | 42 | ||
@@ -61,77 +60,81 @@ std::unique_ptr<NodeMainInstance> NodeMainInstance::Create( | |||
| 61 | 60 | new NodeMainInstance(isolate, event_loop, platform, args, exec_args)); | |
| 62 | 61 | } | |
| 63 | 62 | ||
| 64 | - NodeMainInstance::NodeMainInstance( | ||
| 65 | - Isolate::CreateParams* params, | ||
| 66 | - uv_loop_t* event_loop, | ||
| 67 | - MultiIsolatePlatform* platform, | ||
| 68 | - const std::vector<std::string>& args, | ||
| 69 | - const std::vector<std::string>& exec_args, | ||
| 70 | - const std::vector<size_t>* per_isolate_data_indexes) | ||
| 63 | + NodeMainInstance::NodeMainInstance(const SnapshotData* snapshot_data, | ||
| 64 | + uv_loop_t* event_loop, | ||
| 65 | + MultiIsolatePlatform* platform, | ||
| 66 | + const std::vector<std::string>& args, | ||
| 67 | + const std::vector<std::string>& exec_args) | ||
| 71 | 68 | : args_(args), | |
| 72 | 69 | exec_args_(exec_args), | |
| 73 | 70 | array_buffer_allocator_(ArrayBufferAllocator::Create()), | |
| 74 | 71 | isolate_(nullptr), | |
| 75 | 72 | platform_(platform), | |
| 76 | - isolate_data_(nullptr), | ||
| 77 | - owns_isolate_(true) { | ||
| 78 | - params->array_buffer_allocator = array_buffer_allocator_.get(); | ||
| 79 | - deserialize_mode_ = per_isolate_data_indexes != nullptr; | ||
| 80 | - if (deserialize_mode_) { | ||
| 73 | + isolate_data_(), | ||
| 74 | + isolate_params_(std::make_unique<Isolate::CreateParams>()), | ||
| 75 | + snapshot_data_(snapshot_data) { | ||
| 76 | + isolate_params_->array_buffer_allocator = array_buffer_allocator_.get(); | ||
| 77 | + if (snapshot_data != nullptr) { | ||
| 81 | 78 | // TODO(joyeecheung): collect external references and set it in | |
| 82 | 79 | // params.external_references. | |
| 83 | 80 | const std::vector<intptr_t>& external_references = | |
| 84 | 81 | CollectExternalReferences(); | |
| 85 | - params->external_references = external_references.data(); | ||
| 82 | + isolate_params_->external_references = external_references.data(); | ||
| 83 | + isolate_params_->snapshot_blob = | ||
| 84 | + const_cast<v8::StartupData*>(&(snapshot_data->blob)); | ||
| 86 | 85 | } | |
| 87 | 86 | ||
| 88 | 87 | isolate_ = Isolate::Allocate(); | |
| 89 | 88 | CHECK_NOT_NULL(isolate_); | |
| 90 | 89 | // Register the isolate on the platform before the isolate gets initialized, | |
| 91 | 90 | // so that the isolate can access the platform during initialization. | |
| 92 | 91 | platform->RegisterIsolate(isolate_, event_loop); | |
| 93 | - SetIsolateCreateParamsForNode(params); | ||
| 94 | - Isolate::Initialize(isolate_, *params); | ||
| 92 | + SetIsolateCreateParamsForNode(isolate_params_.get()); | ||
| 93 | + Isolate::Initialize(isolate_, *isolate_params_); | ||
| 95 | 94 | ||
| 96 | 95 | // If the indexes are not nullptr, we are not deserializing | |
| 97 | - CHECK_IMPLIES(deserialize_mode_, params->external_references != nullptr); | ||
| 98 | - isolate_data_ = std::make_unique<IsolateData>(isolate_, | ||
| 99 | - event_loop, | ||
| 100 | - platform, | ||
| 101 | - array_buffer_allocator_.get(), | ||
| 102 | - per_isolate_data_indexes); | ||
| 96 | + isolate_data_ = std::make_unique<IsolateData>( | ||
| 97 | + isolate_, | ||
| 98 | + event_loop, | ||
| 99 | + platform, | ||
| 100 | + array_buffer_allocator_.get(), | ||
| 101 | + snapshot_data == nullptr ? nullptr | ||
| 102 | + : &(snapshot_data->isolate_data_indices)); | ||
| 103 | 103 | IsolateSettings s; | |
| 104 | 104 | SetIsolateMiscHandlers(isolate_, s); | |
| 105 | - if (!deserialize_mode_) { | ||
| 105 | + if (snapshot_data == nullptr) { | ||
| 106 | 106 | // If in deserialize mode, delay until after the deserialization is | |
| 107 | 107 | // complete. | |
| 108 | 108 | SetIsolateErrorHandlers(isolate_, s); | |
| 109 | 109 | } | |
| 110 | 110 | isolate_data_->max_young_gen_size = | |
| 111 | - params->constraints.max_young_generation_size_in_bytes(); | ||
| 111 | + isolate_params_->constraints.max_young_generation_size_in_bytes(); | ||
| 112 | 112 | } | |
| 113 | 113 | ||
| 114 | 114 | void NodeMainInstance::Dispose() { | |
| 115 | - CHECK(!owns_isolate_); | ||
| 115 | + // This should only be called on a main instance that does not own its | ||
| 116 | + // isolate. | ||
| 117 | + CHECK_NULL(isolate_params_); | ||
| 116 | 118 | platform_->DrainTasks(isolate_); | |
| 117 | 119 | } | |
| 118 | 120 | ||
| 119 | 121 | NodeMainInstance::~NodeMainInstance() { | |
| 120 | - if (!owns_isolate_) { | ||
| 122 | + if (isolate_params_ == nullptr) { | ||
| 121 | 123 | return; | |
| 122 | 124 | } | |
| 125 | + // This should only be done on a main instance that owns its isolate. | ||
| 123 | 126 | platform_->UnregisterIsolate(isolate_); | |
| 124 | 127 | isolate_->Dispose(); | |
| 125 | 128 | } | |
| 126 | 129 | ||
| 127 | - int NodeMainInstance::Run(const EnvSerializeInfo* env_info) { | ||
| 130 | + int NodeMainInstance::Run() { | ||
| 128 | 131 | Locker locker(isolate_); | |
| 129 | 132 | Isolate::Scope isolate_scope(isolate_); | |
| 130 | 133 | HandleScope handle_scope(isolate_); | |
| 131 | 134 | ||
| 132 | 135 | int exit_code = 0; | |
| 133 | 136 | DeleteFnPtr<Environment, FreeEnvironment> env = | |
| 134 | - CreateMainEnvironment(&exit_code, env_info); | ||
| 137 | + CreateMainEnvironment(&exit_code); | ||
| 135 | 138 | CHECK_NOT_NULL(env); | |
| 136 | 139 | ||
| 137 | 140 | Context::Scope context_scope(env->context()); | |
@@ -167,8 +170,7 @@ void NodeMainInstance::Run(int* exit_code, Environment* env) { | |||
| 167 | 170 | } | |
| 168 | 171 | ||
| 169 | 172 | DeleteFnPtr<Environment, FreeEnvironment> | |
| 170 | - NodeMainInstance::CreateMainEnvironment(int* exit_code, | ||
| 171 | - const EnvSerializeInfo* env_info) { | ||
| 173 | + NodeMainInstance::CreateMainEnvironment(int* exit_code) { | ||
| 172 | 174 | *exit_code = 0; // Reset the exit code to 0 | |
| 173 | 175 | ||
| 174 | 176 | HandleScope handle_scope(isolate_); | |
@@ -179,16 +181,15 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code, | |||
| 179 | 181 | isolate_->GetHeapProfiler()->StartTrackingHeapObjects(true); | |
| 180 | 182 | } | |
| 181 | 183 | ||
| 182 | - CHECK_IMPLIES(deserialize_mode_, env_info != nullptr); | ||
| 183 | 184 | Local<Context> context; | |
| 184 | 185 | DeleteFnPtr<Environment, FreeEnvironment> env; | |
| 185 | 186 | ||
| 186 | - if (deserialize_mode_) { | ||
| 187 | + if (snapshot_data_ != nullptr) { | ||
| 187 | 188 | env.reset(new Environment(isolate_data_.get(), | |
| 188 | 189 | isolate_, | |
| 189 | 190 | args_, | |
| 190 | 191 | exec_args_, | |
| 191 | - env_info, | ||
| 192 | + &(snapshot_data_->env_info), | ||
| 192 | 193 | EnvironmentFlags::kDefaultFlags, | |
| 193 | 194 | {})); | |
| 194 | 195 | context = Context::FromSnapshot(isolate_, | |
@@ -200,7 +201,7 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code, | |||
| 200 | 201 | Context::Scope context_scope(context); | |
| 201 | 202 | CHECK(InitializeContextRuntime(context).IsJust()); | |
| 202 | 203 | SetIsolateErrorHandlers(isolate_, {}); | |
| 203 | - env->InitializeMainContext(context, env_info); | ||
| 204 | + env->InitializeMainContext(context, &(snapshot_data_->env_info)); | ||
| 204 | 205 | #if HAVE_INSPECTOR | |
| 205 | 206 | env->InitializeInspector({}); | |
| 206 | 207 | #endif | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -15,6 +15,7 @@ namespace node { | |||
| 15 | 15 | ||
| 16 | 16 | class ExternalReferenceRegistry; | |
| 17 | 17 | struct EnvSerializeInfo; | |
| 18 | + struct SnapshotData; | ||
| 18 | 19 | ||
| 19 | 20 | // TODO(joyeecheung): align this with the Worker/WorkerThreadData class. | |
| 20 | 21 | // We may be able to create an abstract class to reuse some of the routines. | |
@@ -48,29 +49,25 @@ class NodeMainInstance { | |||
| 48 | 49 | void Dispose(); | |
| 49 | 50 | ||
| 50 | 51 | // Create a main instance that owns the isolate | |
| 51 | - NodeMainInstance( | ||
| 52 | - v8::Isolate::CreateParams* params, | ||
| 53 | - uv_loop_t* event_loop, | ||
| 54 | - MultiIsolatePlatform* platform, | ||
| 55 | - const std::vector<std::string>& args, | ||
| 56 | - const std::vector<std::string>& exec_args, | ||
| 57 | - const std::vector<size_t>* per_isolate_data_indexes = nullptr); | ||
| 52 | + NodeMainInstance(const SnapshotData* snapshot_data, | ||
| 53 | + uv_loop_t* event_loop, | ||
| 54 | + MultiIsolatePlatform* platform, | ||
| 55 | + const std::vector<std::string>& args, | ||
| 56 | + const std::vector<std::string>& exec_args); | ||
| 58 | 57 | ~NodeMainInstance(); | |
| 59 | 58 | ||
| 60 | 59 | // Start running the Node.js instances, return the exit code when finished. | |
| 61 | - int Run(const EnvSerializeInfo* env_info); | ||
| 60 | + int Run(); | ||
| 62 | 61 | void Run(int* exit_code, Environment* env); | |
| 63 | 62 | ||
| 64 | 63 | IsolateData* isolate_data() { return isolate_data_.get(); } | |
| 65 | 64 | ||
| 66 | 65 | DeleteFnPtr<Environment, FreeEnvironment> CreateMainEnvironment( | |
| 67 | - int* exit_code, const EnvSerializeInfo* env_info); | ||
| 66 | + int* exit_code); | ||
| 68 | 67 | ||
| 69 | 68 | // If nullptr is returned, the binary is not built with embedded | |
| 70 | 69 | // snapshot. | |
| 71 | - static const std::vector<size_t>* GetIsolateDataIndices(); | ||
| 72 | - static v8::StartupData* GetEmbeddedSnapshotBlob(); | ||
| 73 | - static const EnvSerializeInfo* GetEnvSerializeInfo(); | ||
| 70 | + static const SnapshotData* GetEmbeddedSnapshotData(); | ||
| 74 | 71 | static const std::vector<intptr_t>& CollectExternalReferences(); | |
| 75 | 72 | ||
| 76 | 73 | static const size_t kNodeContextIndex = 0; | |
@@ -93,8 +90,8 @@ class NodeMainInstance { | |||
| 93 | 90 | v8::Isolate* isolate_; | |
| 94 | 91 | MultiIsolatePlatform* platform_; | |
| 95 | 92 | std::unique_ptr<IsolateData> isolate_data_; | |
| 96 | - bool owns_isolate_ = false; | ||
| 97 | - bool deserialize_mode_ = false; | ||
| 93 | + std::unique_ptr<v8::Isolate::CreateParams> isolate_params_; | ||
| 94 | + const SnapshotData* snapshot_data_ = nullptr; | ||
| 98 | 95 | }; | |
| 99 | 96 | ||
| 100 | 97 | } // namespace node | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,15 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | 7 | namespace node { | |
| 8 | 8 | ||
| 9 | - v8::StartupData* NodeMainInstance::GetEmbeddedSnapshotBlob() { | ||
| 10 | - return nullptr; | ||
| 11 | - } | ||
| 12 | - | ||
| 13 | - const std::vector<size_t>* NodeMainInstance::GetIsolateDataIndices() { | ||
| 14 | - return nullptr; | ||
| 15 | - } | ||
| 16 | - | ||
| 17 | - const EnvSerializeInfo* NodeMainInstance::GetEnvSerializeInfo() { | ||
| 9 | + const SnapshotData* NodeMainInstance::GetEmbeddedSnapshotData() { | ||
| 18 | 10 | return nullptr; | |
| 19 | 11 | } | |
| 20 | 12 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -53,31 +53,28 @@ static const char blob_data[] = { | |||
| 53 | 53 | ||
| 54 | 54 | static const int blob_size = )" | |
| 55 | 55 | << data->blob.raw_size << R"(; | |
| 56 | - static v8::StartupData blob = { blob_data, blob_size }; | ||
| 57 | - )"; | ||
| 58 | - | ||
| 59 | - ss << R"(v8::StartupData* NodeMainInstance::GetEmbeddedSnapshotBlob() { | ||
| 60 | - return &blob; | ||
| 61 | - } | ||
| 62 | 56 | ||
| 63 | - static const std::vector<size_t> isolate_data_indices { | ||
| 57 | + SnapshotData snapshot_data { | ||
| 58 | + // -- blob begins -- | ||
| 59 | + { blob_data, blob_size }, | ||
| 60 | + // -- blob ends -- | ||
| 61 | + // -- isolate_data_indices begins -- | ||
| 62 | + { | ||
| 64 | 63 | )"; | |
| 65 | 64 | WriteVector(&ss, | |
| 66 | 65 | data->isolate_data_indices.data(), | |
| 67 | 66 | data->isolate_data_indices.size()); | |
| 68 | - ss << R"(}; | ||
| 69 | - | ||
| 70 | - const std::vector<size_t>* NodeMainInstance::GetIsolateDataIndices() { | ||
| 71 | - return &isolate_data_indices; | ||
| 67 | + ss << R"(}, | ||
| 68 | + // -- isolate_data_indices ends -- | ||
| 69 | + // -- env_info begins -- | ||
| 70 | + )" << data->env_info | ||
| 71 | + << R"( | ||
| 72 | + // -- env_info ends -- | ||
| 73 | + }; | ||
| 74 | + | ||
| 75 | + const SnapshotData* NodeMainInstance::GetEmbeddedSnapshotData() { | ||
| 76 | + return &snapshot_data; | ||
| 72 | 77 | } | |
| 73 | - | ||
| 74 | - static const EnvSerializeInfo env_info )" | ||
| 75 | - << data->env_info << R"(; | ||
| 76 | - | ||
| 77 | - const EnvSerializeInfo* NodeMainInstance::GetEnvSerializeInfo() { | ||
| 78 | - return &env_info; | ||
| 79 | - } | ||
| 80 | - | ||
| 81 | 78 | } // namespace node | |
| 82 | 79 | )"; | |
| 83 | 80 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -22,8 +22,7 @@ In the default build of the Node.js executable, to embed a V8 startup snapshot | |||
| 22 | 22 | into the Node.js executable, `libnode` is first built with these unresolved | |
| 23 | 23 | symbols: | |
| 24 | 24 | ||
| 25 | - - `node::NodeMainInstance::GetEmbeddedSnapshotBlob` | ||
| 26 | - - `node::NodeMainInstance::GetIsolateDataIndices` | ||
| 25 | + - `node::NodeMainInstance::GetEmbeddedSnapshotData` | ||
| 27 | 26 | ||
| 28 | 27 | Then the `node_mksnapshot` executable is built with C++ files in this | |
| 29 | 28 | directory, as well as `src/node_snapshot_stub.cc` which defines the unresolved | |
| Back | FazBrowse Home | New Git URL |
0 commit comments