Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2867233002: [wasm] Do not unregister an ArrayBuffer if it is already external (Closed)
Patch Set: Eric's review Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/wasm/wasm-module.h ('k') | src/wasm/wasm-objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 6
7 #include "src/asmjs/asm-js.h" 7 #include "src/asmjs/asm-js.h"
8 #include "src/assembler-inl.h" 8 #include "src/assembler-inl.h"
9 #include "src/base/atomic-utils.h" 9 #include "src/base/atomic-utils.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 void* backing_store, size_t size, 848 void* backing_store, size_t size,
849 bool is_external, 849 bool is_external,
850 bool enable_guard_regions) { 850 bool enable_guard_regions) {
851 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); 851 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
852 JSArrayBuffer::Setup(buffer, isolate, is_external, backing_store, 852 JSArrayBuffer::Setup(buffer, isolate, is_external, backing_store,
853 static_cast<int>(size)); 853 static_cast<int>(size));
854 buffer->set_is_neuterable(false); 854 buffer->set_is_neuterable(false);
855 buffer->set_is_wasm_buffer(true); 855 buffer->set_is_wasm_buffer(true);
856 buffer->set_has_guard_region(enable_guard_regions); 856 buffer->set_has_guard_region(enable_guard_regions);
857 857
858 if (is_external) { 858 if (enable_guard_regions) {
859 // We mark the buffer as external if we allocated it here with guard 859 // We mark the buffer as external if we allocated it here with guard
860 // pages. That means we need to arrange for it to be freed. 860 // pages. That means we need to arrange for it to be freed.
861 861
862 // TODO(eholk): Finalizers may not run when the main thread is shutting 862 // TODO(eholk): Finalizers may not run when the main thread is shutting
863 // down, which means we may leak memory here. 863 // down, which means we may leak memory here.
864 Handle<Object> global_handle = isolate->global_handles()->Create(*buffer); 864 Handle<Object> global_handle = isolate->global_handles()->Create(*buffer);
865 GlobalHandles::MakeWeak(global_handle.location(), global_handle.location(), 865 GlobalHandles::MakeWeak(global_handle.location(), global_handle.location(),
866 &MemoryFinalizer, v8::WeakCallbackType::kFinalizer); 866 &MemoryFinalizer, v8::WeakCallbackType::kFinalizer);
867 } 867 }
868 return buffer; 868 return buffer;
(...skipping 1355 matching lines...) Expand 10 before | Expand all | Expand 10 after
2224 WasmInstanceObject::cast(*instance)->compiled_module(); 2224 WasmInstanceObject::cast(*instance)->compiled_module();
2225 return handle(compiled_module->script()); 2225 return handle(compiled_module->script());
2226 } 2226 }
2227 2227
2228 bool wasm::IsWasmCodegenAllowed(Isolate* isolate, Handle<Context> context) { 2228 bool wasm::IsWasmCodegenAllowed(Isolate* isolate, Handle<Context> context) {
2229 return isolate->allow_code_gen_callback() == nullptr || 2229 return isolate->allow_code_gen_callback() == nullptr ||
2230 isolate->allow_code_gen_callback()(v8::Utils::ToLocal(context)); 2230 isolate->allow_code_gen_callback()(v8::Utils::ToLocal(context));
2231 } 2231 }
2232 2232
2233 void wasm::DetachWebAssemblyMemoryBuffer(Isolate* isolate, 2233 void wasm::DetachWebAssemblyMemoryBuffer(Isolate* isolate,
2234 Handle<JSArrayBuffer> buffer) { 2234 Handle<JSArrayBuffer> buffer,
2235 bool free_memory) {
2235 int64_t byte_length = 2236 int64_t byte_length =
2236 buffer->byte_length()->IsNumber() 2237 buffer->byte_length()->IsNumber()
2237 ? static_cast<uint32_t>(buffer->byte_length()->Number()) 2238 ? static_cast<uint32_t>(buffer->byte_length()->Number())
2238 : 0; 2239 : 0;
2239 if (buffer.is_null() || byte_length == 0) return; 2240 if (buffer.is_null() || byte_length == 0) return;
2240 const bool has_guard_regions = buffer->has_guard_region(); 2241 const bool has_guard_regions = buffer->has_guard_region();
2241 const bool is_external = buffer->is_external(); 2242 const bool is_external = buffer->is_external();
2242 void* backing_store = buffer->backing_store(); 2243 void* backing_store = buffer->backing_store();
2243 DCHECK(!buffer->is_neuterable()); 2244 DCHECK(!buffer->is_neuterable());
2244 if (!has_guard_regions && !is_external) { 2245 if (!has_guard_regions && !is_external) {
2245 buffer->set_is_external(true); 2246 buffer->set_is_external(true);
2246 isolate->heap()->UnregisterArrayBuffer(*buffer); 2247 isolate->heap()->UnregisterArrayBuffer(*buffer);
2247 } 2248 }
2248 buffer->set_is_neuterable(true); 2249 buffer->set_is_neuterable(true);
2249 buffer->Neuter(); 2250 buffer->Neuter();
2251 // Neuter but do not free, as when pages == 0, the backing store is being used
2252 // by the new buffer.
2253 if (!free_memory) return;
2250 if (has_guard_regions) { 2254 if (has_guard_regions) {
2251 base::OS::Free(backing_store, RoundUp(i::wasm::kWasmMaxHeapOffset, 2255 base::OS::Free(backing_store, RoundUp(i::wasm::kWasmMaxHeapOffset,
2252 base::OS::CommitPageSize())); 2256 base::OS::CommitPageSize()));
2253 reinterpret_cast<v8::Isolate*>(isolate) 2257 reinterpret_cast<v8::Isolate*>(isolate)
2254 ->AdjustAmountOfExternalAllocatedMemory(-byte_length); 2258 ->AdjustAmountOfExternalAllocatedMemory(-byte_length);
2255 } else if (!has_guard_regions && !is_external) { 2259 } else if (!has_guard_regions && !is_external) {
2256 isolate->array_buffer_allocator()->Free(backing_store, byte_length); 2260 isolate->array_buffer_allocator()->Free(backing_store, byte_length);
2257 } 2261 }
2258 } 2262 }
2259 2263
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after
3354 callee_compiled->instruction_start()); 3358 callee_compiled->instruction_start());
3355 } 3359 }
3356 DCHECK_EQ(non_compiled_functions.size(), idx); 3360 DCHECK_EQ(non_compiled_functions.size(), idx);
3357 } 3361 }
3358 3362
3359 Code* ret = 3363 Code* ret =
3360 Code::cast(compiled_module->code_table()->get(func_to_return_idx)); 3364 Code::cast(compiled_module->code_table()->get(func_to_return_idx));
3361 DCHECK_EQ(Code::WASM_FUNCTION, ret->kind()); 3365 DCHECK_EQ(Code::WASM_FUNCTION, ret->kind());
3362 return handle(ret, isolate); 3366 return handle(ret, isolate);
3363 } 3367 }
OLDNEW
« no previous file with comments | « src/wasm/wasm-module.h ('k') | src/wasm/wasm-objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698