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

Side by Side Diff: src/d8.cc

Issue 1252623003: [d8] Fix tsan bugs (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: re-enable d8-worker-sharedarraybuffer Created 5 years, 5 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/d8.h ('k') | test/mjsunit/mjsunit.status » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 5
6 // Defined when linking against shared lib on Windows. 6 // Defined when linking against shared lib on Windows.
7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED)
8 #define V8_SHARED 8 #define V8_SHARED
9 #endif 9 #endif
10 10
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 bool Shell::ExecuteString(Isolate* isolate, Local<String> source, 328 bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
329 Local<Value> name, bool print_result, 329 Local<Value> name, bool print_result,
330 bool report_exceptions, SourceType source_type) { 330 bool report_exceptions, SourceType source_type) {
331 #ifndef V8_SHARED 331 #ifndef V8_SHARED
332 bool FLAG_debugger = i::FLAG_debugger; 332 bool FLAG_debugger = i::FLAG_debugger;
333 #else 333 #else
334 bool FLAG_debugger = false; 334 bool FLAG_debugger = false;
335 #endif // !V8_SHARED 335 #endif // !V8_SHARED
336 HandleScope handle_scope(isolate); 336 HandleScope handle_scope(isolate);
337 TryCatch try_catch(isolate); 337 TryCatch try_catch(isolate);
338 options.script_executed = true; 338 options.set_script_executed(true);
Jarin 2015/07/23 06:49:14 It looks like the set_script_executed could be cal
binji 2015/07/24 23:13:08 Done.
339 if (FLAG_debugger) { 339 if (FLAG_debugger) {
340 // When debugging make exceptions appear to be uncaught. 340 // When debugging make exceptions appear to be uncaught.
341 try_catch.SetVerbose(true); 341 try_catch.SetVerbose(true);
342 } 342 }
343 343
344 MaybeLocal<Value> maybe_result; 344 MaybeLocal<Value> maybe_result;
345 { 345 {
346 PerIsolateData* data = PerIsolateData::Get(isolate); 346 PerIsolateData* data = PerIsolateData::Get(isolate);
347 Local<Context> realm = 347 Local<Context> realm =
348 Local<Context>::New(isolate, data->realms_[data->realm_current_]); 348 Local<Context>::New(isolate, data->realms_[data->realm_current_]);
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 Local<Context> context = Shell::CreateEvaluationContext(isolate); 1638 Local<Context> context = Shell::CreateEvaluationContext(isolate);
1639 { 1639 {
1640 Context::Scope cscope(context); 1640 Context::Scope cscope(context);
1641 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); 1641 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate));
1642 Execute(isolate); 1642 Execute(isolate);
1643 } 1643 }
1644 } 1644 }
1645 Shell::CollectGarbage(isolate); 1645 Shell::CollectGarbage(isolate);
1646 } 1646 }
1647 done_semaphore_.Signal(); 1647 done_semaphore_.Signal();
1648 } while (!Shell::options.last_run); 1648 } while (!Shell::options.last_run());
1649 1649
1650 isolate->Dispose(); 1650 isolate->Dispose();
1651 } 1651 }
1652 1652
1653 1653
1654 void SourceGroup::StartExecuteInThread() { 1654 void SourceGroup::StartExecuteInThread() {
1655 if (thread_ == NULL) { 1655 if (thread_ == NULL) {
1656 thread_ = new IsolateThread(this); 1656 thread_ = new IsolateThread(this);
1657 thread_->Start(); 1657 thread_->Start();
1658 } 1658 }
1659 next_semaphore_.Signal(); 1659 next_semaphore_.Signal();
1660 } 1660 }
1661 1661
1662 1662
1663 void SourceGroup::WaitForThread() { 1663 void SourceGroup::WaitForThread() {
1664 if (thread_ == NULL) return; 1664 if (thread_ == NULL) return;
1665 if (Shell::options.last_run) { 1665 if (Shell::options.last_run()) {
1666 thread_->Join(); 1666 thread_->Join();
1667 } else { 1667 } else {
1668 done_semaphore_.Wait(); 1668 done_semaphore_.Wait();
1669 } 1669 }
1670 } 1670 }
1671 1671
1672 1672
1673 SerializationData::~SerializationData() { 1673 SerializationData::~SerializationData() {
1674 // Any ArrayBuffer::Contents are owned by this SerializationData object if 1674 // Any ArrayBuffer::Contents are owned by this SerializationData object if
1675 // ownership hasn't been transferred out via ReadArrayBufferContents. 1675 // ownership hasn't been transferred out via ReadArrayBufferContents.
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 2093
2094 int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) { 2094 int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) {
2095 #ifndef V8_SHARED 2095 #ifndef V8_SHARED
2096 for (int i = 1; i < options.num_isolates; ++i) { 2096 for (int i = 1; i < options.num_isolates; ++i) {
2097 options.isolate_sources[i].StartExecuteInThread(); 2097 options.isolate_sources[i].StartExecuteInThread();
2098 } 2098 }
2099 #endif // !V8_SHARED 2099 #endif // !V8_SHARED
2100 { 2100 {
2101 HandleScope scope(isolate); 2101 HandleScope scope(isolate);
2102 Local<Context> context = CreateEvaluationContext(isolate); 2102 Local<Context> context = CreateEvaluationContext(isolate);
2103 if (options.last_run && options.use_interactive_shell()) { 2103 if (options.last_run() && options.use_interactive_shell()) {
2104 // Keep using the same context in the interactive shell. 2104 // Keep using the same context in the interactive shell.
2105 evaluation_context_.Reset(isolate, context); 2105 evaluation_context_.Reset(isolate, context);
2106 #ifndef V8_SHARED 2106 #ifndef V8_SHARED
2107 // If the interactive debugger is enabled make sure to activate 2107 // If the interactive debugger is enabled make sure to activate
2108 // it before running the files passed on the command line. 2108 // it before running the files passed on the command line.
2109 if (i::FLAG_debugger) { 2109 if (i::FLAG_debugger) {
2110 InstallUtilityScript(isolate); 2110 InstallUtilityScript(isolate);
2111 } 2111 }
2112 #endif // !V8_SHARED 2112 #endif // !V8_SHARED
2113 } 2113 }
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2239 if (!FindInObjectList(sab, to_transfer)) { 2239 if (!FindInObjectList(sab, to_transfer)) {
2240 Throw(isolate, "SharedArrayBuffer must be transferred"); 2240 Throw(isolate, "SharedArrayBuffer must be transferred");
2241 return false; 2241 return false;
2242 } 2242 }
2243 2243
2244 SharedArrayBuffer::Contents contents; 2244 SharedArrayBuffer::Contents contents;
2245 if (sab->IsExternal()) { 2245 if (sab->IsExternal()) {
2246 contents = sab->GetContents(); 2246 contents = sab->GetContents();
2247 } else { 2247 } else {
2248 contents = sab->Externalize(); 2248 contents = sab->Externalize();
2249 base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer());
2249 externalized_shared_contents_.Add(contents); 2250 externalized_shared_contents_.Add(contents);
2250 } 2251 }
2251 out_data->WriteSharedArrayBufferContents(contents); 2252 out_data->WriteSharedArrayBufferContents(contents);
2252 } else if (value->IsObject()) { 2253 } else if (value->IsObject()) {
2253 Local<Object> object = Local<Object>::Cast(value); 2254 Local<Object> object = Local<Object>::Cast(value);
2254 if (FindInObjectList(object, *seen_objects)) { 2255 if (FindInObjectList(object, *seen_objects)) {
2255 Throw(isolate, "Duplicated objects not supported"); 2256 Throw(isolate, "Duplicated objects not supported");
2256 return false; 2257 return false;
2257 } 2258 }
2258 seen_objects->Add(object); 2259 seen_objects->Add(object);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 workers_.Clear(); 2395 workers_.Clear();
2395 } 2396 }
2396 2397
2397 for (int i = 0; i < workers_copy.length(); ++i) { 2398 for (int i = 0; i < workers_copy.length(); ++i) {
2398 Worker* worker = workers_copy[i]; 2399 Worker* worker = workers_copy[i];
2399 worker->WaitForThread(); 2400 worker->WaitForThread();
2400 delete worker; 2401 delete worker;
2401 } 2402 }
2402 2403
2403 // Now that all workers are terminated, we can re-enable Worker creation. 2404 // Now that all workers are terminated, we can re-enable Worker creation.
2404 { 2405 base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer());
2405 base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer()); 2406 allow_new_workers_ = true;
2406 allow_new_workers_ = true;
2407 }
2408 2407
2409 for (int i = 0; i < externalized_shared_contents_.length(); ++i) { 2408 for (int i = 0; i < externalized_shared_contents_.length(); ++i) {
2410 const SharedArrayBuffer::Contents& contents = 2409 const SharedArrayBuffer::Contents& contents =
2411 externalized_shared_contents_[i]; 2410 externalized_shared_contents_[i];
2412 Shell::array_buffer_allocator->Free(contents.Data(), contents.ByteLength()); 2411 Shell::array_buffer_allocator->Free(contents.Data(), contents.ByteLength());
2413 } 2412 }
2414 externalized_shared_contents_.Clear(); 2413 externalized_shared_contents_.Clear();
2415 } 2414 }
2416 2415
2417 2416
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2545 #endif 2544 #endif
2546 2545
2547 if (options.stress_opt || options.stress_deopt) { 2546 if (options.stress_opt || options.stress_deopt) {
2548 Testing::SetStressRunType(options.stress_opt 2547 Testing::SetStressRunType(options.stress_opt
2549 ? Testing::kStressTypeOpt 2548 ? Testing::kStressTypeOpt
2550 : Testing::kStressTypeDeopt); 2549 : Testing::kStressTypeDeopt);
2551 int stress_runs = Testing::GetStressRuns(); 2550 int stress_runs = Testing::GetStressRuns();
2552 for (int i = 0; i < stress_runs && result == 0; i++) { 2551 for (int i = 0; i < stress_runs && result == 0; i++) {
2553 printf("============ Stress %d/%d ============\n", i + 1, stress_runs); 2552 printf("============ Stress %d/%d ============\n", i + 1, stress_runs);
2554 Testing::PrepareStressRun(i); 2553 Testing::PrepareStressRun(i);
2555 options.last_run = (i == stress_runs - 1); 2554 options.set_last_run(i == stress_runs - 1);
Jarin 2015/07/23 06:49:14 I am a bit confused about how this can be run in p
binji 2015/07/24 23:13:08 No, the SourceGroup spawns a thread per isolate th
2556 result = RunMain(isolate, argc, argv); 2555 result = RunMain(isolate, argc, argv);
2557 } 2556 }
2558 printf("======== Full Deoptimization =======\n"); 2557 printf("======== Full Deoptimization =======\n");
2559 Testing::DeoptimizeAll(); 2558 Testing::DeoptimizeAll();
2560 #if !defined(V8_SHARED) 2559 #if !defined(V8_SHARED)
2561 } else if (i::FLAG_stress_runs > 0) { 2560 } else if (i::FLAG_stress_runs > 0) {
2562 int stress_runs = i::FLAG_stress_runs; 2561 int stress_runs = i::FLAG_stress_runs;
2563 for (int i = 0; i < stress_runs && result == 0; i++) { 2562 for (int i = 0; i < stress_runs && result == 0; i++) {
2564 printf("============ Run %d/%d ============\n", i + 1, stress_runs); 2563 printf("============ Run %d/%d ============\n", i + 1, stress_runs);
2565 options.last_run = (i == stress_runs - 1); 2564 options.set_last_run(i == stress_runs - 1);
Jarin 2015/07/23 06:49:14 Same here.
2566 result = RunMain(isolate, argc, argv); 2565 result = RunMain(isolate, argc, argv);
2567 } 2566 }
2568 #endif 2567 #endif
2569 } else { 2568 } else {
2570 result = RunMain(isolate, argc, argv); 2569 result = RunMain(isolate, argc, argv);
2571 } 2570 }
2572 2571
2573 // Run interactive shell if explicitly requested or if no script has been 2572 // Run interactive shell if explicitly requested or if no script has been
2574 // executed, but never on --test 2573 // executed, but never on --test
2575 if (options.use_interactive_shell()) { 2574 if (options.use_interactive_shell()) {
(...skipping 30 matching lines...) Expand all
2606 } 2605 }
2607 2606
2608 } // namespace v8 2607 } // namespace v8
2609 2608
2610 2609
2611 #ifndef GOOGLE3 2610 #ifndef GOOGLE3
2612 int main(int argc, char* argv[]) { 2611 int main(int argc, char* argv[]) {
2613 return v8::Shell::Main(argc, argv); 2612 return v8::Shell::Main(argc, argv);
2614 } 2613 }
2615 #endif 2614 #endif
OLDNEW
« no previous file with comments | « src/d8.h ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698