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

Side by Side Diff: runtime/vm/thread.cc

Issue 1965823002: Initial isolate reload support (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/thread.h" 5 #include "vm/thread.h"
6 6
7 #include "vm/compiler_stats.h" 7 #include "vm/compiler_stats.h"
8 #include "vm/dart_api_state.h" 8 #include "vm/dart_api_state.h"
9 #include "vm/growable_array.h" 9 #include "vm/growable_array.h"
10 #include "vm/isolate.h" 10 #include "vm/isolate.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 top_resource_(NULL), 76 top_resource_(NULL),
77 long_jump_base_(NULL), 77 long_jump_base_(NULL),
78 no_callback_scope_depth_(0), 78 no_callback_scope_depth_(0),
79 #if defined(DEBUG) 79 #if defined(DEBUG)
80 top_handle_scope_(NULL), 80 top_handle_scope_(NULL),
81 no_handle_scope_depth_(0), 81 no_handle_scope_depth_(0),
82 no_safepoint_scope_depth_(0), 82 no_safepoint_scope_depth_(0),
83 #endif 83 #endif
84 reusable_handles_(), 84 reusable_handles_(),
85 saved_stack_limit_(0), 85 saved_stack_limit_(0),
86 defer_oob_messages_count_(0),
86 deferred_interrupts_mask_(0), 87 deferred_interrupts_mask_(0),
87 deferred_interrupts_(0), 88 deferred_interrupts_(0),
88 stack_overflow_count_(0), 89 stack_overflow_count_(0),
89 cha_(NULL), 90 cha_(NULL),
90 deopt_id_(0), 91 deopt_id_(0),
91 pending_functions_(GrowableObjectArray::null()), 92 pending_functions_(GrowableObjectArray::null()),
92 sticky_error_(Error::null()), 93 sticky_error_(Error::null()),
93 compiler_stats_(NULL), 94 compiler_stats_(NULL),
94 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) 95 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
95 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) 96 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 return 0; // No interrupt was requested. 411 return 0; // No interrupt was requested.
411 } 412 }
412 uword interrupt_bits = stack_limit_ & kInterruptsMask; 413 uword interrupt_bits = stack_limit_ & kInterruptsMask;
413 stack_limit_ = saved_stack_limit_; 414 stack_limit_ = saved_stack_limit_;
414 return interrupt_bits; 415 return interrupt_bits;
415 } 416 }
416 417
417 418
418 void Thread::DeferOOBMessageInterrupts() { 419 void Thread::DeferOOBMessageInterrupts() {
419 MonitorLocker ml(thread_lock_); 420 MonitorLocker ml(thread_lock_);
421 defer_oob_messages_count_++;
422 if (defer_oob_messages_count_ > 1) {
423 // OOB message interrupts are already deferred.
424 return;
425 }
420 ASSERT(deferred_interrupts_mask_ == 0); 426 ASSERT(deferred_interrupts_mask_ == 0);
421 deferred_interrupts_mask_ = kMessageInterrupt; 427 deferred_interrupts_mask_ = kMessageInterrupt;
422 428
423 if (stack_limit_ != saved_stack_limit_) { 429 if (stack_limit_ != saved_stack_limit_) {
424 // Defer any interrupts which are currently pending. 430 // Defer any interrupts which are currently pending.
425 deferred_interrupts_ = stack_limit_ & deferred_interrupts_mask_; 431 deferred_interrupts_ = stack_limit_ & deferred_interrupts_mask_;
426 432
427 // Clear deferrable interrupts, if present. 433 // Clear deferrable interrupts, if present.
428 stack_limit_ &= ~deferred_interrupts_mask_; 434 stack_limit_ &= ~deferred_interrupts_mask_;
429 435
430 if ((stack_limit_ & kInterruptsMask) == 0) { 436 if ((stack_limit_ & kInterruptsMask) == 0) {
431 // No other pending interrupts. Restore normal stack limit. 437 // No other pending interrupts. Restore normal stack limit.
432 stack_limit_ = saved_stack_limit_; 438 stack_limit_ = saved_stack_limit_;
433 } 439 }
434 } 440 }
435 if (FLAG_trace_service && FLAG_trace_service_verbose) { 441 if (FLAG_trace_service && FLAG_trace_service_verbose) {
436 OS::Print("[+%" Pd64 "ms] Isolate %s deferring OOB interrupts\n", 442 OS::Print("[+%" Pd64 "ms] Isolate %s deferring OOB interrupts\n",
437 Dart::timestamp(), isolate()->name()); 443 Dart::timestamp(), isolate()->name());
438 } 444 }
439 } 445 }
440 446
441 447
442 void Thread::RestoreOOBMessageInterrupts() { 448 void Thread::RestoreOOBMessageInterrupts() {
443 MonitorLocker ml(thread_lock_); 449 MonitorLocker ml(thread_lock_);
450 defer_oob_messages_count_--;
451 if (defer_oob_messages_count_ > 0) {
452 return;
453 }
454 ASSERT(defer_oob_messages_count_ == 0);
444 ASSERT(deferred_interrupts_mask_ == kMessageInterrupt); 455 ASSERT(deferred_interrupts_mask_ == kMessageInterrupt);
445 deferred_interrupts_mask_ = 0; 456 deferred_interrupts_mask_ = 0;
446 if (deferred_interrupts_ != 0) { 457 if (deferred_interrupts_ != 0) {
447 if (stack_limit_ == saved_stack_limit_) { 458 if (stack_limit_ == saved_stack_limit_) {
448 stack_limit_ = kInterruptStackLimit & ~kInterruptsMask; 459 stack_limit_ = kInterruptStackLimit & ~kInterruptsMask;
449 } 460 }
450 stack_limit_ |= deferred_interrupts_; 461 stack_limit_ |= deferred_interrupts_;
451 deferred_interrupts_ = 0; 462 deferred_interrupts_ = 0;
452 } 463 }
453 if (FLAG_trace_service && FLAG_trace_service_verbose) { 464 if (FLAG_trace_service && FLAG_trace_service_verbose) {
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 742
732 DisableThreadInterruptsScope::~DisableThreadInterruptsScope() { 743 DisableThreadInterruptsScope::~DisableThreadInterruptsScope() {
733 if (thread() != NULL) { 744 if (thread() != NULL) {
734 OSThread* os_thread = thread()->os_thread(); 745 OSThread* os_thread = thread()->os_thread();
735 ASSERT(os_thread != NULL); 746 ASSERT(os_thread != NULL);
736 os_thread->EnableThreadInterrupts(); 747 os_thread->EnableThreadInterrupts();
737 } 748 }
738 } 749 }
739 750
740 } // namespace dart 751 } // namespace dart
OLDNEW
« runtime/vm/service.cc ('K') | « runtime/vm/thread.h ('k') | runtime/vm/unit_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698