| OLD | NEW | 
|     1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2013, 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 #ifndef RUNTIME_VM_ISOLATE_H_ |     5 #ifndef RUNTIME_VM_ISOLATE_H_ | 
|     6 #define RUNTIME_VM_ISOLATE_H_ |     6 #define RUNTIME_VM_ISOLATE_H_ | 
|     7  |     7  | 
|     8 #include "include/dart_api.h" |     8 #include "include/dart_api.h" | 
|     9 #include "platform/assert.h" |     9 #include "platform/assert.h" | 
|    10 #include "vm/atomic.h" |    10 #include "vm/atomic.h" | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    66 class StackResource; |    66 class StackResource; | 
|    67 class StackZone; |    67 class StackZone; | 
|    68 class StoreBuffer; |    68 class StoreBuffer; | 
|    69 class StubCode; |    69 class StubCode; | 
|    70 class ThreadRegistry; |    70 class ThreadRegistry; | 
|    71 class UserTag; |    71 class UserTag; | 
|    72  |    72  | 
|    73  |    73  | 
|    74 class PendingLazyDeopt { |    74 class PendingLazyDeopt { | 
|    75  public: |    75  public: | 
|    76   PendingLazyDeopt(uword fp, uword pc) : fp_(fp), pc_(pc) { } |    76   PendingLazyDeopt(uword fp, uword pc) : fp_(fp), pc_(pc) {} | 
|    77   uword fp() { return fp_; } |    77   uword fp() { return fp_; } | 
|    78   uword pc() { return pc_; } |    78   uword pc() { return pc_; } | 
|    79   void set_pc(uword pc) { pc_ = pc; } |    79   void set_pc(uword pc) { pc_ = pc; } | 
|    80  |    80  | 
|    81  private: |    81  private: | 
|    82   uword fp_; |    82   uword fp_; | 
|    83   uword pc_; |    83   uword pc_; | 
|    84 }; |    84 }; | 
|    85  |    85  | 
|    86  |    86  | 
|    87 class IsolateVisitor { |    87 class IsolateVisitor { | 
|    88  public: |    88  public: | 
|    89   IsolateVisitor() {} |    89   IsolateVisitor() {} | 
|    90   virtual ~IsolateVisitor() {} |    90   virtual ~IsolateVisitor() {} | 
|    91  |    91  | 
|    92   virtual void VisitIsolate(Isolate* isolate) = 0; |    92   virtual void VisitIsolate(Isolate* isolate) = 0; | 
|    93  |    93  | 
|    94  private: |    94  private: | 
|    95   DISALLOW_COPY_AND_ASSIGN(IsolateVisitor); |    95   DISALLOW_COPY_AND_ASSIGN(IsolateVisitor); | 
|    96 }; |    96 }; | 
|    97  |    97  | 
|    98  |    98  | 
|    99 // Disallow OOB message handling within this scope. |    99 // Disallow OOB message handling within this scope. | 
|   100 class NoOOBMessageScope : public StackResource { |   100 class NoOOBMessageScope : public StackResource { | 
|   101  public: |   101  public: | 
|   102   explicit NoOOBMessageScope(Thread* thread); |   102   explicit NoOOBMessageScope(Thread* thread); | 
|   103   ~NoOOBMessageScope(); |   103   ~NoOOBMessageScope(); | 
 |   104  | 
|   104  private: |   105  private: | 
|   105   DISALLOW_COPY_AND_ASSIGN(NoOOBMessageScope); |   106   DISALLOW_COPY_AND_ASSIGN(NoOOBMessageScope); | 
|   106 }; |   107 }; | 
|   107  |   108  | 
|   108  |   109  | 
|   109 // Disallow isolate reload. |   110 // Disallow isolate reload. | 
|   110 class NoReloadScope : public StackResource { |   111 class NoReloadScope : public StackResource { | 
|   111  public: |   112  public: | 
|   112   NoReloadScope(Isolate* isolate, Thread* thread); |   113   NoReloadScope(Isolate* isolate, Thread* thread); | 
|   113   ~NoReloadScope(); |   114   ~NoReloadScope(); | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   199  |   200  | 
|   200   int64_t start_time() const { return start_time_; } |   201   int64_t start_time() const { return start_time_; } | 
|   201  |   202  | 
|   202   Dart_Port main_port() const { return main_port_; } |   203   Dart_Port main_port() const { return main_port_; } | 
|   203   void set_main_port(Dart_Port port) { |   204   void set_main_port(Dart_Port port) { | 
|   204     ASSERT(main_port_ == 0);  // Only set main port once. |   205     ASSERT(main_port_ == 0);  // Only set main port once. | 
|   205     main_port_ = port; |   206     main_port_ = port; | 
|   206   } |   207   } | 
|   207   Dart_Port origin_id() const { return origin_id_; } |   208   Dart_Port origin_id() const { return origin_id_; } | 
|   208   void set_origin_id(Dart_Port id) { |   209   void set_origin_id(Dart_Port id) { | 
|   209     ASSERT((id == main_port_ && origin_id_ == 0) || |   210     ASSERT((id == main_port_ && origin_id_ == 0) || (origin_id_ == main_port_)); | 
|   210            (origin_id_ == main_port_)); |  | 
|   211     origin_id_ = id; |   211     origin_id_ = id; | 
|   212   } |   212   } | 
|   213   void set_pause_capability(uint64_t value) { pause_capability_ = value; } |   213   void set_pause_capability(uint64_t value) { pause_capability_ = value; } | 
|   214   uint64_t pause_capability() const { return pause_capability_; } |   214   uint64_t pause_capability() const { return pause_capability_; } | 
|   215   void set_terminate_capability(uint64_t value) { |   215   void set_terminate_capability(uint64_t value) { | 
|   216     terminate_capability_ = value; |   216     terminate_capability_ = value; | 
|   217   } |   217   } | 
|   218   uint64_t terminate_capability() const { return terminate_capability_; } |   218   uint64_t terminate_capability() const { return terminate_capability_; } | 
|   219  |   219  | 
|   220   void SendInternalLibMessage(LibMsgId msg_id, uint64_t capability); |   220   void SendInternalLibMessage(LibMsgId msg_id, uint64_t capability); | 
|   221  |   221  | 
|   222   Heap* heap() const { return heap_; } |   222   Heap* heap() const { return heap_; } | 
|   223   void set_heap(Heap* value) { heap_ = value; } |   223   void set_heap(Heap* value) { heap_ = value; } | 
|   224  |   224  | 
|   225   ObjectStore* object_store() const { return object_store_; } |   225   ObjectStore* object_store() const { return object_store_; } | 
|   226   void set_object_store(ObjectStore* value) { object_store_ = value; } |   226   void set_object_store(ObjectStore* value) { object_store_ = value; } | 
|   227   static intptr_t object_store_offset() { |   227   static intptr_t object_store_offset() { | 
|   228     return OFFSET_OF(Isolate, object_store_); |   228     return OFFSET_OF(Isolate, object_store_); | 
|   229   } |   229   } | 
|   230  |   230  | 
|   231   ApiState* api_state() const { return api_state_; } |   231   ApiState* api_state() const { return api_state_; } | 
|   232   void set_api_state(ApiState* value) { api_state_ = value; } |   232   void set_api_state(ApiState* value) { api_state_ = value; } | 
|   233  |   233  | 
|   234   void set_init_callback_data(void* value) { |   234   void set_init_callback_data(void* value) { init_callback_data_ = value; } | 
|   235     init_callback_data_ = value; |   235   void* init_callback_data() const { return init_callback_data_; } | 
|   236   } |  | 
|   237   void* init_callback_data() const { |  | 
|   238     return init_callback_data_; |  | 
|   239   } |  | 
|   240  |   236  | 
|   241   Dart_EnvironmentCallback environment_callback() const { |   237   Dart_EnvironmentCallback environment_callback() const { | 
|   242     return environment_callback_; |   238     return environment_callback_; | 
|   243   } |   239   } | 
|   244   void set_environment_callback(Dart_EnvironmentCallback value) { |   240   void set_environment_callback(Dart_EnvironmentCallback value) { | 
|   245     environment_callback_ = value; |   241     environment_callback_ = value; | 
|   246   } |   242   } | 
|   247  |   243  | 
|   248   Dart_LibraryTagHandler library_tag_handler() const { |   244   Dart_LibraryTagHandler library_tag_handler() const { | 
|   249     return library_tag_handler_; |   245     return library_tag_handler_; | 
|   250   } |   246   } | 
|   251   void set_library_tag_handler(Dart_LibraryTagHandler value) { |   247   void set_library_tag_handler(Dart_LibraryTagHandler value) { | 
|   252     library_tag_handler_ = value; |   248     library_tag_handler_ = value; | 
|   253   } |   249   } | 
|   254  |   250  | 
|   255   void SetupInstructionsSnapshotPage( |   251   void SetupInstructionsSnapshotPage( | 
|   256       const uint8_t* instructions_snapshot_buffer); |   252       const uint8_t* instructions_snapshot_buffer); | 
|   257   void SetupDataSnapshotPage( |   253   void SetupDataSnapshotPage(const uint8_t* instructions_snapshot_buffer); | 
|   258       const uint8_t* instructions_snapshot_buffer); |  | 
|   259  |   254  | 
|   260   void ScheduleMessageInterrupts(); |   255   void ScheduleMessageInterrupts(); | 
|   261  |   256  | 
|   262   // Marks all libraries as loaded. |   257   // Marks all libraries as loaded. | 
|   263   void DoneLoading(); |   258   void DoneLoading(); | 
|   264   void DoneFinalizing(); |   259   void DoneFinalizing(); | 
|   265  |   260  | 
|   266   // By default the reload context is deleted. This parameter allows |   261   // By default the reload context is deleted. This parameter allows | 
|   267   // the caller to delete is separately if it is still needed. |   262   // the caller to delete is separately if it is still needed. | 
|   268   bool ReloadSources(JSONStream* js, |   263   bool ReloadSources(JSONStream* js, | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|   287   void set_spawn_state(IsolateSpawnState* value) { spawn_state_ = value; } |   282   void set_spawn_state(IsolateSpawnState* value) { spawn_state_ = value; } | 
|   288  |   283  | 
|   289   Mutex* mutex() const { return mutex_; } |   284   Mutex* mutex() const { return mutex_; } | 
|   290   Mutex* symbols_mutex() const { return symbols_mutex_; } |   285   Mutex* symbols_mutex() const { return symbols_mutex_; } | 
|   291   Mutex* type_canonicalization_mutex() const { |   286   Mutex* type_canonicalization_mutex() const { | 
|   292     return type_canonicalization_mutex_; |   287     return type_canonicalization_mutex_; | 
|   293   } |   288   } | 
|   294   Mutex* constant_canonicalization_mutex() const { |   289   Mutex* constant_canonicalization_mutex() const { | 
|   295     return constant_canonicalization_mutex_; |   290     return constant_canonicalization_mutex_; | 
|   296   } |   291   } | 
|   297   Mutex* megamorphic_lookup_mutex() const { |   292   Mutex* megamorphic_lookup_mutex() const { return megamorphic_lookup_mutex_; } | 
|   298     return megamorphic_lookup_mutex_; |  | 
|   299   } |  | 
|   300  |   293  | 
|   301   Debugger* debugger() const { |   294   Debugger* debugger() const { | 
|   302     if (!FLAG_support_debugger) { |   295     if (!FLAG_support_debugger) { | 
|   303       return NULL; |   296       return NULL; | 
|   304     } |   297     } | 
|   305     ASSERT(debugger_ != NULL); |   298     ASSERT(debugger_ != NULL); | 
|   306     return debugger_; |   299     return debugger_; | 
|   307   } |   300   } | 
|   308  |   301  | 
|   309   void set_single_step(bool value) { single_step_ = value; } |   302   void set_single_step(bool value) { single_step_ = value; } | 
|   310   bool single_step() const { return single_step_; } |   303   bool single_step() const { return single_step_; } | 
|   311   static intptr_t single_step_offset() { |   304   static intptr_t single_step_offset() { | 
|   312     return OFFSET_OF(Isolate, single_step_); |   305     return OFFSET_OF(Isolate, single_step_); | 
|   313   } |   306   } | 
|   314  |   307  | 
|   315   void set_has_compiled_code(bool value) { has_compiled_code_ = value; } |   308   void set_has_compiled_code(bool value) { has_compiled_code_ = value; } | 
|   316   bool has_compiled_code() const { return has_compiled_code_; } |   309   bool has_compiled_code() const { return has_compiled_code_; } | 
|   317  |   310  | 
|   318   // Lets the embedder know that a service message resulted in a resume request. |   311   // Lets the embedder know that a service message resulted in a resume request. | 
|   319   void SetResumeRequest() { |   312   void SetResumeRequest() { | 
|   320     resume_request_ = true; |   313     resume_request_ = true; | 
|   321     set_last_resume_timestamp(); |   314     set_last_resume_timestamp(); | 
|   322   } |   315   } | 
|   323  |   316  | 
|   324   void set_last_resume_timestamp() { |   317   void set_last_resume_timestamp() { | 
|   325     last_resume_timestamp_ = OS::GetCurrentTimeMillis(); |   318     last_resume_timestamp_ = OS::GetCurrentTimeMillis(); | 
|   326   } |   319   } | 
|   327  |   320  | 
|   328   int64_t last_resume_timestamp() const { |   321   int64_t last_resume_timestamp() const { return last_resume_timestamp_; } | 
|   329     return last_resume_timestamp_; |  | 
|   330   } |  | 
|   331  |   322  | 
|   332   // Returns whether the vm service has requested that the debugger |   323   // Returns whether the vm service has requested that the debugger | 
|   333   // resume execution. |   324   // resume execution. | 
|   334   bool GetAndClearResumeRequest() { |   325   bool GetAndClearResumeRequest() { | 
|   335     bool resume_request = resume_request_; |   326     bool resume_request = resume_request_; | 
|   336     resume_request_ = false; |   327     resume_request_ = false; | 
|   337     return resume_request; |   328     return resume_request; | 
|   338   } |   329   } | 
|   339  |   330  | 
|   340   // Verify that the sender has the capability to pause or terminate the |   331   // Verify that the sender has the capability to pause or terminate the | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   392     return create_callback_; |   383     return create_callback_; | 
|   393   } |   384   } | 
|   394  |   385  | 
|   395   static void SetShutdownCallback(Dart_IsolateShutdownCallback cb) { |   386   static void SetShutdownCallback(Dart_IsolateShutdownCallback cb) { | 
|   396     shutdown_callback_ = cb; |   387     shutdown_callback_ = cb; | 
|   397   } |   388   } | 
|   398   static Dart_IsolateShutdownCallback ShutdownCallback() { |   389   static Dart_IsolateShutdownCallback ShutdownCallback() { | 
|   399     return shutdown_callback_; |   390     return shutdown_callback_; | 
|   400   } |   391   } | 
|   401  |   392  | 
|   402   void set_object_id_ring(ObjectIdRing* ring) { |   393   void set_object_id_ring(ObjectIdRing* ring) { object_id_ring_ = ring; } | 
|   403     object_id_ring_ = ring; |   394   ObjectIdRing* object_id_ring() { return object_id_ring_; } | 
|   404   } |  | 
|   405   ObjectIdRing* object_id_ring() { |  | 
|   406     return object_id_ring_; |  | 
|   407   } |  | 
|   408  |   395  | 
|   409   void AddPendingDeopt(uword fp, uword pc); |   396   void AddPendingDeopt(uword fp, uword pc); | 
|   410   uword FindPendingDeopt(uword fp) const; |   397   uword FindPendingDeopt(uword fp) const; | 
|   411   void ClearPendingDeoptsAtOrBelow(uword fp) const; |   398   void ClearPendingDeoptsAtOrBelow(uword fp) const; | 
|   412   MallocGrowableArray<PendingLazyDeopt>* pending_deopts() const { |   399   MallocGrowableArray<PendingLazyDeopt>* pending_deopts() const { | 
|   413     return pending_deopts_; |   400     return pending_deopts_; | 
|   414   } |   401   } | 
|   415   bool IsDeoptimizing() const { return deopt_context_ != NULL; } |   402   bool IsDeoptimizing() const { return deopt_context_ != NULL; } | 
|   416   DeoptContext* deopt_context() const { return deopt_context_; } |   403   DeoptContext* deopt_context() const { return deopt_context_; } | 
|   417   void set_deopt_context(DeoptContext* value) { |   404   void set_deopt_context(DeoptContext* value) { | 
|   418     ASSERT(value == NULL || deopt_context_ == NULL); |   405     ASSERT(value == NULL || deopt_context_ == NULL); | 
|   419     deopt_context_ = value; |   406     deopt_context_ = value; | 
|   420   } |   407   } | 
|   421  |   408  | 
|   422   BackgroundCompiler* background_compiler() const { |   409   BackgroundCompiler* background_compiler() const { | 
|   423     return background_compiler_; |   410     return background_compiler_; | 
|   424   } |   411   } | 
|   425   void set_background_compiler(BackgroundCompiler* value) { |   412   void set_background_compiler(BackgroundCompiler* value) { | 
|   426     // Do not overwrite a background compiler (memory leak). |   413     // Do not overwrite a background compiler (memory leak). | 
|   427     ASSERT((value == NULL) || (background_compiler_ == NULL)); |   414     ASSERT((value == NULL) || (background_compiler_ == NULL)); | 
|   428     background_compiler_ = value; |   415     background_compiler_ = value; | 
|   429   } |   416   } | 
|   430  |   417  | 
|   431   void enable_background_compiler() { |   418   void enable_background_compiler() { | 
|   432     background_compiler_disabled_depth_--; |   419     background_compiler_disabled_depth_--; | 
|   433     if (background_compiler_disabled_depth_ < 0) { |   420     if (background_compiler_disabled_depth_ < 0) { | 
|   434       FATAL("Mismatched number of calls to disable_background_compiler and " |   421       FATAL( | 
|   435             "enable_background_compiler."); |   422           "Mismatched number of calls to disable_background_compiler and " | 
 |   423           "enable_background_compiler."); | 
|   436     } |   424     } | 
|   437   } |   425   } | 
|   438  |   426  | 
|   439   void disable_background_compiler() { |   427   void disable_background_compiler() { background_compiler_disabled_depth_++; } | 
|   440     background_compiler_disabled_depth_++; |  | 
|   441   } |  | 
|   442  |   428  | 
|   443   bool is_background_compiler_disabled() const { |   429   bool is_background_compiler_disabled() const { | 
|   444     return background_compiler_disabled_depth_ > 0; |   430     return background_compiler_disabled_depth_ > 0; | 
|   445   } |   431   } | 
|   446  |   432  | 
|   447   void UpdateLastAllocationProfileAccumulatorResetTimestamp() { |   433   void UpdateLastAllocationProfileAccumulatorResetTimestamp() { | 
|   448     last_allocationprofile_accumulator_reset_timestamp_ = |   434     last_allocationprofile_accumulator_reset_timestamp_ = | 
|   449         OS::GetCurrentTimeMillis(); |   435         OS::GetCurrentTimeMillis(); | 
|   450   } |   436   } | 
|   451  |   437  | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|   478  |   464  | 
|   479 #ifndef PRODUCT |   465 #ifndef PRODUCT | 
|   480   void PrintJSON(JSONStream* stream, bool ref = true); |   466   void PrintJSON(JSONStream* stream, bool ref = true); | 
|   481 #endif |   467 #endif | 
|   482  |   468  | 
|   483   // Mutator thread is used to aggregate compiler stats. |   469   // Mutator thread is used to aggregate compiler stats. | 
|   484   CompilerStats* aggregate_compiler_stats() { |   470   CompilerStats* aggregate_compiler_stats() { | 
|   485     return mutator_thread()->compiler_stats(); |   471     return mutator_thread()->compiler_stats(); | 
|   486   } |   472   } | 
|   487  |   473  | 
|   488   VMTagCounters* vm_tag_counters() { |   474   VMTagCounters* vm_tag_counters() { return &vm_tag_counters_; } | 
|   489     return &vm_tag_counters_; |  | 
|   490   } |  | 
|   491  |   475  | 
|   492   bool IsReloading() const { |   476   bool IsReloading() const { return reload_context_ != NULL; } | 
|   493     return reload_context_ != NULL; |  | 
|   494   } |  | 
|   495  |   477  | 
|   496   IsolateReloadContext* reload_context() { |   478   IsolateReloadContext* reload_context() { return reload_context_; } | 
|   497     return reload_context_; |  | 
|   498   } |  | 
|   499  |   479  | 
|   500   void DeleteReloadContext(); |   480   void DeleteReloadContext(); | 
|   501  |   481  | 
|   502   bool HasAttemptedReload() const { |   482   bool HasAttemptedReload() const { return has_attempted_reload_; } | 
|   503     return has_attempted_reload_; |  | 
|   504   } |  | 
|   505  |   483  | 
|   506   bool CanReload() const; |   484   bool CanReload() const; | 
|   507  |   485  | 
|   508   void set_last_reload_timestamp(int64_t value) { |   486   void set_last_reload_timestamp(int64_t value) { | 
|   509     last_reload_timestamp_ = value; |   487     last_reload_timestamp_ = value; | 
|   510   } |   488   } | 
|   511   int64_t last_reload_timestamp() const { |   489   int64_t last_reload_timestamp() const { return last_reload_timestamp_; } | 
|   512     return last_reload_timestamp_; |  | 
|   513   } |  | 
|   514  |   490  | 
|   515   bool IsPaused() const; |   491   bool IsPaused() const; | 
|   516  |   492  | 
|   517   bool should_pause_post_service_request() const { |   493   bool should_pause_post_service_request() const { | 
|   518     return should_pause_post_service_request_; |   494     return should_pause_post_service_request_; | 
|   519   } |   495   } | 
|   520   void set_should_pause_post_service_request( |   496   void set_should_pause_post_service_request( | 
|   521       bool should_pause_post_service_request) { |   497       bool should_pause_post_service_request) { | 
|   522     should_pause_post_service_request_ = should_pause_post_service_request; |   498     should_pause_post_service_request_ = should_pause_post_service_request; | 
|   523   } |   499   } | 
|   524  |   500  | 
|   525   void PausePostRequest(); |   501   void PausePostRequest(); | 
|   526  |   502  | 
|   527   uword user_tag() const { |   503   uword user_tag() const { return user_tag_; } | 
|   528     return user_tag_; |   504   static intptr_t user_tag_offset() { return OFFSET_OF(Isolate, user_tag_); } | 
|   529   } |  | 
|   530   static intptr_t user_tag_offset() { |  | 
|   531     return OFFSET_OF(Isolate, user_tag_); |  | 
|   532   } |  | 
|   533   static intptr_t current_tag_offset() { |   505   static intptr_t current_tag_offset() { | 
|   534     return OFFSET_OF(Isolate, current_tag_); |   506     return OFFSET_OF(Isolate, current_tag_); | 
|   535   } |   507   } | 
|   536   static intptr_t default_tag_offset() { |   508   static intptr_t default_tag_offset() { | 
|   537     return OFFSET_OF(Isolate, default_tag_); |   509     return OFFSET_OF(Isolate, default_tag_); | 
|   538   } |   510   } | 
|   539  |   511  | 
|   540 #define ISOLATE_METRIC_ACCESSOR(type, variable, name, unit)                    \ |   512 #define ISOLATE_METRIC_ACCESSOR(type, variable, name, unit)                    \ | 
|   541   type* Get##variable##Metric() { return &metric_##variable##_; } |   513   type* Get##variable##Metric() { return &metric_##variable##_; } | 
|   542   ISOLATE_METRIC_LIST(ISOLATE_METRIC_ACCESSOR); |   514   ISOLATE_METRIC_LIST(ISOLATE_METRIC_ACCESSOR); | 
|   543 #undef ISOLATE_METRIC_ACCESSOR |   515 #undef ISOLATE_METRIC_ACCESSOR | 
|   544  |   516  | 
|   545   static intptr_t IsolateListLength(); |   517   static intptr_t IsolateListLength(); | 
|   546  |   518  | 
|   547   RawGrowableObjectArray* tag_table() const { return tag_table_; } |   519   RawGrowableObjectArray* tag_table() const { return tag_table_; } | 
|   548   void set_tag_table(const GrowableObjectArray& value); |   520   void set_tag_table(const GrowableObjectArray& value); | 
|   549  |   521  | 
|   550   RawUserTag* current_tag() const { return current_tag_; } |   522   RawUserTag* current_tag() const { return current_tag_; } | 
|   551   void set_current_tag(const UserTag& tag); |   523   void set_current_tag(const UserTag& tag); | 
|   552  |   524  | 
|   553   RawUserTag* default_tag() const { return default_tag_; } |   525   RawUserTag* default_tag() const { return default_tag_; } | 
|   554   void set_default_tag(const UserTag& tag); |   526   void set_default_tag(const UserTag& tag); | 
|   555  |   527  | 
|   556   void set_ic_miss_code(const Code& code); |   528   void set_ic_miss_code(const Code& code); | 
|   557  |   529  | 
|   558   Metric* metrics_list_head() { |   530   Metric* metrics_list_head() { return metrics_list_head_; } | 
|   559     return metrics_list_head_; |  | 
|   560   } |  | 
|   561  |   531  | 
|   562   void set_metrics_list_head(Metric* metric) { |   532   void set_metrics_list_head(Metric* metric) { metrics_list_head_ = metric; } | 
|   563     metrics_list_head_ = metric; |  | 
|   564   } |  | 
|   565  |   533  | 
|   566   RawGrowableObjectArray* deoptimized_code_array() const { |   534   RawGrowableObjectArray* deoptimized_code_array() const { | 
|   567     return deoptimized_code_array_; |   535     return deoptimized_code_array_; | 
|   568   } |   536   } | 
|   569   void set_deoptimized_code_array(const GrowableObjectArray& value); |   537   void set_deoptimized_code_array(const GrowableObjectArray& value); | 
|   570   void TrackDeoptimizedCode(const Code& code); |   538   void TrackDeoptimizedCode(const Code& code); | 
|   571  |   539  | 
|   572   // Also sends a paused at exit event over the service protocol. |   540   // Also sends a paused at exit event over the service protocol. | 
|   573   void SetStickyError(RawError* sticky_error); |   541   void SetStickyError(RawError* sticky_error); | 
|   574  |   542  | 
|   575   RawError* sticky_error() const { return sticky_error_; } |   543   RawError* sticky_error() const { return sticky_error_; } | 
|   576   void clear_sticky_error(); |   544   void clear_sticky_error(); | 
|   577  |   545  | 
|   578   bool compilation_allowed() const { return compilation_allowed_; } |   546   bool compilation_allowed() const { return compilation_allowed_; } | 
|   579   void set_compilation_allowed(bool allowed) { |   547   void set_compilation_allowed(bool allowed) { compilation_allowed_ = allowed; } | 
|   580     compilation_allowed_ = allowed; |  | 
|   581   } |  | 
|   582  |   548  | 
|   583   // In precompilation we finalize all regular classes before compiling. |   549   // In precompilation we finalize all regular classes before compiling. | 
|   584   bool all_classes_finalized() const { return all_classes_finalized_; } |   550   bool all_classes_finalized() const { return all_classes_finalized_; } | 
|   585   void set_all_classes_finalized(bool value) { |   551   void set_all_classes_finalized(bool value) { all_classes_finalized_ = value; } | 
|   586     all_classes_finalized_ = value; |  | 
|   587   } |  | 
|   588  |   552  | 
|   589   // True during top level parsing. |   553   // True during top level parsing. | 
|   590   bool IsTopLevelParsing() { |   554   bool IsTopLevelParsing() { | 
|   591     const intptr_t value = |   555     const intptr_t value = | 
|   592         AtomicOperations::LoadRelaxed(&top_level_parsing_count_); |   556         AtomicOperations::LoadRelaxed(&top_level_parsing_count_); | 
|   593     ASSERT(value >= 0); |   557     ASSERT(value >= 0); | 
|   594     return value > 0; |   558     return value > 0; | 
|   595   } |   559   } | 
|   596  |   560  | 
|   597   void IncrTopLevelParsingCount() { |   561   void IncrTopLevelParsingCount() { | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   615  |   579  | 
|   616   // Used by background compiler which field became boxed and must trigger |   580   // Used by background compiler which field became boxed and must trigger | 
|   617   // deoptimization in the mutator thread. |   581   // deoptimization in the mutator thread. | 
|   618   void AddDeoptimizingBoxedField(const Field& field); |   582   void AddDeoptimizingBoxedField(const Field& field); | 
|   619   // Returns Field::null() if none available in the list. |   583   // Returns Field::null() if none available in the list. | 
|   620   RawField* GetDeoptimizingBoxedField(); |   584   RawField* GetDeoptimizingBoxedField(); | 
|   621  |   585  | 
|   622 #ifndef PRODUCT |   586 #ifndef PRODUCT | 
|   623   RawObject* InvokePendingServiceExtensionCalls(); |   587   RawObject* InvokePendingServiceExtensionCalls(); | 
|   624   void AppendServiceExtensionCall(const Instance& closure, |   588   void AppendServiceExtensionCall(const Instance& closure, | 
|   625                            const String& method_name, |   589                                   const String& method_name, | 
|   626                            const Array& parameter_keys, |   590                                   const Array& parameter_keys, | 
|   627                            const Array& parameter_values, |   591                                   const Array& parameter_values, | 
|   628                            const Instance& reply_port, |   592                                   const Instance& reply_port, | 
|   629                            const Instance& id); |   593                                   const Instance& id); | 
|   630   void RegisterServiceExtensionHandler(const String& name, |   594   void RegisterServiceExtensionHandler(const String& name, | 
|   631                                        const Instance& closure); |   595                                        const Instance& closure); | 
|   632   RawInstance* LookupServiceExtensionHandler(const String& name); |   596   RawInstance* LookupServiceExtensionHandler(const String& name); | 
|   633 #endif |   597 #endif | 
|   634  |   598  | 
|   635   static void VisitIsolates(IsolateVisitor* visitor); |   599   static void VisitIsolates(IsolateVisitor* visitor); | 
|   636  |   600  | 
|   637   // Handle service messages until we are told to resume execution. |   601   // Handle service messages until we are told to resume execution. | 
|   638   void PauseEventHandler(); |   602   void PauseEventHandler(); | 
|   639  |   603  | 
|   640   void AddClosureFunction(const Function& function) const; |   604   void AddClosureFunction(const Function& function) const; | 
|   641   RawFunction* LookupClosureFunction(const Function& parent, |   605   RawFunction* LookupClosureFunction(const Function& parent, | 
|   642                                      TokenPosition token_pos) const; |   606                                      TokenPosition token_pos) const; | 
|   643   intptr_t FindClosureIndex(const Function& needle) const; |   607   intptr_t FindClosureIndex(const Function& needle) const; | 
|   644   RawFunction* ClosureFunctionFromIndex(intptr_t idx) const; |   608   RawFunction* ClosureFunctionFromIndex(intptr_t idx) const; | 
|   645  |   609  | 
|   646   bool is_service_isolate() const { return is_service_isolate_; } |   610   bool is_service_isolate() const { return is_service_isolate_; } | 
|   647  |   611  | 
|   648   // Isolate-specific flag handling. |   612   // Isolate-specific flag handling. | 
|   649   static void FlagsInitialize(Dart_IsolateFlags* api_flags); |   613   static void FlagsInitialize(Dart_IsolateFlags* api_flags); | 
|   650   void FlagsCopyTo(Dart_IsolateFlags* api_flags) const; |   614   void FlagsCopyTo(Dart_IsolateFlags* api_flags) const; | 
|   651   void FlagsCopyFrom(const Dart_IsolateFlags& api_flags); |   615   void FlagsCopyFrom(const Dart_IsolateFlags& api_flags); | 
|   652  |   616  | 
|   653 #if defined(PRODUCT) |   617 #if defined(PRODUCT) | 
|   654   bool type_checks() const { return FLAG_enable_type_checks; } |   618   bool type_checks() const { return FLAG_enable_type_checks; } | 
|   655   bool asserts() const { return FLAG_enable_asserts; } |   619   bool asserts() const { return FLAG_enable_asserts; } | 
|   656   bool error_on_bad_type() const { return FLAG_error_on_bad_type; } |   620   bool error_on_bad_type() const { return FLAG_error_on_bad_type; } | 
|   657   bool error_on_bad_override() const { return FLAG_error_on_bad_override; } |   621   bool error_on_bad_override() const { return FLAG_error_on_bad_override; } | 
|   658 #else  // defined(PRODUCT) |   622 #else   // defined(PRODUCT) | 
|   659   bool type_checks() const { return type_checks_; } |   623   bool type_checks() const { return type_checks_; } | 
|   660   bool asserts() const { return asserts_; } |   624   bool asserts() const { return asserts_; } | 
|   661   bool error_on_bad_type() const { return error_on_bad_type_; } |   625   bool error_on_bad_type() const { return error_on_bad_type_; } | 
|   662   bool error_on_bad_override() const { return error_on_bad_override_; } |   626   bool error_on_bad_override() const { return error_on_bad_override_; } | 
|   663 #endif  // defined(PRODUCT) |   627 #endif  // defined(PRODUCT) | 
|   664  |   628  | 
|   665   static void KillAllIsolates(LibMsgId msg_id); |   629   static void KillAllIsolates(LibMsgId msg_id); | 
|   666   static void KillIfExists(Isolate* isolate, LibMsgId msg_id); |   630   static void KillIfExists(Isolate* isolate, LibMsgId msg_id); | 
|   667  |   631  | 
|   668   static void DisableIsolateCreation(); |   632   static void DisableIsolateCreation(); | 
|   669   static void EnableIsolateCreation(); |   633   static void EnableIsolateCreation(); | 
|   670   static bool IsolateCreationEnabled(); |   634   static bool IsolateCreationEnabled(); | 
|   671  |   635  | 
|   672   void StopBackgroundCompiler(); |   636   void StopBackgroundCompiler(); | 
|   673  |   637  | 
|   674   intptr_t reload_every_n_stack_overflow_checks() const { |   638   intptr_t reload_every_n_stack_overflow_checks() const { | 
|   675     return reload_every_n_stack_overflow_checks_; |   639     return reload_every_n_stack_overflow_checks_; | 
|   676   } |   640   } | 
|   677  |   641  | 
|   678   void MaybeIncreaseReloadEveryNStackOverflowChecks(); |   642   void MaybeIncreaseReloadEveryNStackOverflowChecks(); | 
|   679  |   643  | 
|   680  private: |   644  private: | 
|   681   friend class Dart;  // Init, InitOnce, Shutdown. |   645   friend class Dart;                  // Init, InitOnce, Shutdown. | 
|   682   friend class IsolateKillerVisitor;  // Kill(). |   646   friend class IsolateKillerVisitor;  // Kill(). | 
|   683  |   647  | 
|   684   explicit Isolate(const Dart_IsolateFlags& api_flags); |   648   explicit Isolate(const Dart_IsolateFlags& api_flags); | 
|   685  |   649  | 
|   686   static void InitOnce(); |   650   static void InitOnce(); | 
|   687   static Isolate* Init(const char* name_prefix, |   651   static Isolate* Init(const char* name_prefix, | 
|   688                        const Dart_IsolateFlags& api_flags, |   652                        const Dart_IsolateFlags& api_flags, | 
|   689                        bool is_vm_isolate = false); |   653                        bool is_vm_isolate = false); | 
|   690  |   654  | 
|   691   // The isolates_list_monitor_ should be held when calling Kill(). |   655   // The isolates_list_monitor_ should be held when calling Kill(). | 
|   692   void KillLocked(LibMsgId msg_id); |   656   void KillLocked(LibMsgId msg_id); | 
|   693  |   657  | 
|   694   void LowLevelShutdown(); |   658   void LowLevelShutdown(); | 
|   695   void Shutdown(); |   659   void Shutdown(); | 
|   696  |   660  | 
|   697   void BuildName(const char* name_prefix); |   661   void BuildName(const char* name_prefix); | 
|   698  |   662  | 
|   699   void ProfileIdle(); |   663   void ProfileIdle(); | 
|   700  |   664  | 
|   701   // Visit all object pointers. Caller must ensure concurrent sweeper is not |   665   // Visit all object pointers. Caller must ensure concurrent sweeper is not | 
|   702   // running, and the visitor must not allocate. |   666   // running, and the visitor must not allocate. | 
|   703   void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames); |   667   void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames); | 
|   704  |   668  | 
|   705   void set_user_tag(uword tag) { |   669   void set_user_tag(uword tag) { user_tag_ = tag; } | 
|   706     user_tag_ = tag; |  | 
|   707   } |  | 
|   708  |   670  | 
|   709   RawGrowableObjectArray* GetAndClearPendingServiceExtensionCalls(); |   671   RawGrowableObjectArray* GetAndClearPendingServiceExtensionCalls(); | 
|   710   RawGrowableObjectArray* pending_service_extension_calls() const { |   672   RawGrowableObjectArray* pending_service_extension_calls() const { | 
|   711     return pending_service_extension_calls_; |   673     return pending_service_extension_calls_; | 
|   712   } |   674   } | 
|   713   void set_pending_service_extension_calls(const GrowableObjectArray& value); |   675   void set_pending_service_extension_calls(const GrowableObjectArray& value); | 
|   714   RawGrowableObjectArray* registered_service_extension_handlers() const { |   676   RawGrowableObjectArray* registered_service_extension_handlers() const { | 
|   715     return registered_service_extension_handlers_; |   677     return registered_service_extension_handlers_; | 
|   716   } |   678   } | 
|   717   void set_registered_service_extension_handlers( |   679   void set_registered_service_extension_handlers( | 
|   718       const GrowableObjectArray& value); |   680       const GrowableObjectArray& value); | 
|   719  |   681  | 
|   720   Monitor* threads_lock() const; |   682   Monitor* threads_lock() const; | 
|   721   Thread* ScheduleThread(bool is_mutator, bool bypass_safepoint = false); |   683   Thread* ScheduleThread(bool is_mutator, bool bypass_safepoint = false); | 
|   722   void UnscheduleThread( |   684   void UnscheduleThread(Thread* thread, | 
|   723       Thread* thread, bool is_mutator, bool bypass_safepoint = false); |   685                         bool is_mutator, | 
 |   686                         bool bypass_safepoint = false); | 
|   724  |   687  | 
|   725   // DEPRECATED: Use Thread's methods instead. During migration, these default |   688   // DEPRECATED: Use Thread's methods instead. During migration, these default | 
|   726   // to using the mutator thread (which must also be the current thread). |   689   // to using the mutator thread (which must also be the current thread). | 
|   727   Zone* current_zone() const { |   690   Zone* current_zone() const { | 
|   728     ASSERT(Thread::Current() == mutator_thread()); |   691     ASSERT(Thread::Current() == mutator_thread()); | 
|   729     return mutator_thread()->zone(); |   692     return mutator_thread()->zone(); | 
|   730   } |   693   } | 
|   731  |   694  | 
|   732   // Accessed from generated code: |   695   // Accessed from generated code: | 
|   733   StoreBuffer* store_buffer_; |   696   StoreBuffer* store_buffer_; | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|   754   void* init_callback_data_; |   717   void* init_callback_data_; | 
|   755   Dart_EnvironmentCallback environment_callback_; |   718   Dart_EnvironmentCallback environment_callback_; | 
|   756   Dart_LibraryTagHandler library_tag_handler_; |   719   Dart_LibraryTagHandler library_tag_handler_; | 
|   757   ApiState* api_state_; |   720   ApiState* api_state_; | 
|   758   Debugger* debugger_; |   721   Debugger* debugger_; | 
|   759   bool resume_request_; |   722   bool resume_request_; | 
|   760   int64_t last_resume_timestamp_; |   723   int64_t last_resume_timestamp_; | 
|   761   bool has_compiled_code_;  // Can check that no compilation occured. |   724   bool has_compiled_code_;  // Can check that no compilation occured. | 
|   762   Random random_; |   725   Random random_; | 
|   763   Simulator* simulator_; |   726   Simulator* simulator_; | 
|   764   Mutex* mutex_;  // Protects compiler stats. |   727   Mutex* mutex_;          // Protects compiler stats. | 
|   765   Mutex* symbols_mutex_;  // Protects concurrent access to the symbol table. |   728   Mutex* symbols_mutex_;  // Protects concurrent access to the symbol table. | 
|   766   Mutex* type_canonicalization_mutex_;  // Protects type canonicalization. |   729   Mutex* type_canonicalization_mutex_;      // Protects type canonicalization. | 
|   767   Mutex* constant_canonicalization_mutex_;  // Protects const canonicalization. |   730   Mutex* constant_canonicalization_mutex_;  // Protects const canonicalization. | 
|   768   Mutex* megamorphic_lookup_mutex_;  // Protects megamorphic table lookup. |   731   Mutex* megamorphic_lookup_mutex_;  // Protects megamorphic table lookup. | 
|   769   MessageHandler* message_handler_; |   732   MessageHandler* message_handler_; | 
|   770   IsolateSpawnState* spawn_state_; |   733   IsolateSpawnState* spawn_state_; | 
|   771   bool is_runnable_; |   734   bool is_runnable_; | 
|   772   Dart_GcPrologueCallback gc_prologue_callback_; |   735   Dart_GcPrologueCallback gc_prologue_callback_; | 
|   773   Dart_GcEpilogueCallback gc_epilogue_callback_; |   736   Dart_GcEpilogueCallback gc_epilogue_callback_; | 
|   774   intptr_t defer_finalization_count_; |   737   intptr_t defer_finalization_count_; | 
|   775   MallocGrowableArray<PendingLazyDeopt>* pending_deopts_; |   738   MallocGrowableArray<PendingLazyDeopt>* pending_deopts_; | 
|   776   DeoptContext* deopt_context_; |   739   DeoptContext* deopt_context_; | 
|   777  |   740  | 
|   778   bool is_service_isolate_; |   741   bool is_service_isolate_; | 
|   779  |   742  | 
|   780   // Isolate-specific flags. |   743 // Isolate-specific flags. | 
|   781   NOT_IN_PRODUCT( |   744 #if !defined(PRODUCT) | 
|   782     bool type_checks_; |   745   bool type_checks_; | 
|   783     bool asserts_; |   746   bool asserts_; | 
|   784     bool error_on_bad_type_; |   747   bool error_on_bad_type_; | 
|   785     bool error_on_bad_override_; |   748   bool error_on_bad_override_; | 
|   786   ) |   749 #endif  // !defined(PRODUCT) | 
|   787  |   750  | 
|   788   // Timestamps of last operation via service. |   751   // Timestamps of last operation via service. | 
|   789   int64_t last_allocationprofile_accumulator_reset_timestamp_; |   752   int64_t last_allocationprofile_accumulator_reset_timestamp_; | 
|   790   int64_t last_allocationprofile_gc_timestamp_; |   753   int64_t last_allocationprofile_gc_timestamp_; | 
|   791  |   754  | 
|   792   // Ring buffer of objects assigned an id. |   755   // Ring buffer of objects assigned an id. | 
|   793   ObjectIdRing* object_id_ring_; |   756   ObjectIdRing* object_id_ring_; | 
|   794  |   757  | 
|   795   VMTagCounters vm_tag_counters_; |   758   VMTagCounters vm_tag_counters_; | 
|   796   RawGrowableObjectArray* tag_table_; |   759   RawGrowableObjectArray* tag_table_; | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   874   static bool AddIsolateToList(Isolate* isolate); |   837   static bool AddIsolateToList(Isolate* isolate); | 
|   875   static void RemoveIsolateFromList(Isolate* isolate); |   838   static void RemoveIsolateFromList(Isolate* isolate); | 
|   876  |   839  | 
|   877   // This monitor protects isolates_list_head_, and creation_enabled_. |   840   // This monitor protects isolates_list_head_, and creation_enabled_. | 
|   878   static Monitor* isolates_list_monitor_; |   841   static Monitor* isolates_list_monitor_; | 
|   879   static Isolate* isolates_list_head_; |   842   static Isolate* isolates_list_head_; | 
|   880   static bool creation_enabled_; |   843   static bool creation_enabled_; | 
|   881  |   844  | 
|   882 #define REUSABLE_FRIEND_DECLARATION(name)                                      \ |   845 #define REUSABLE_FRIEND_DECLARATION(name)                                      \ | 
|   883   friend class Reusable##name##HandleScope; |   846   friend class Reusable##name##HandleScope; | 
|   884 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) |   847   REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) | 
|   885 #undef REUSABLE_FRIEND_DECLARATION |   848 #undef REUSABLE_FRIEND_DECLARATION | 
|   886  |   849  | 
|   887   friend class Become;  // VisitObjectPointers |   850   friend class Become;    // VisitObjectPointers | 
|   888   friend class GCMarker;  // VisitObjectPointers |   851   friend class GCMarker;  // VisitObjectPointers | 
|   889   friend class SafepointHandler; |   852   friend class SafepointHandler; | 
|   890   friend class Scavenger;  // VisitObjectPointers |   853   friend class Scavenger;  // VisitObjectPointers | 
|   891   friend class ServiceIsolate; |   854   friend class ServiceIsolate; | 
|   892   friend class Thread; |   855   friend class Thread; | 
|   893   friend class Timeline; |   856   friend class Timeline; | 
|   894   friend class NoReloadScope;  // reload_block |   857   friend class NoReloadScope;  // reload_block | 
|   895  |   858  | 
|   896  |   859  | 
|   897   DISALLOW_COPY_AND_ASSIGN(Isolate); |   860   DISALLOW_COPY_AND_ASSIGN(Isolate); | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1020   intptr_t* spawn_count_; |   983   intptr_t* spawn_count_; | 
|  1021  |   984  | 
|  1022   Dart_IsolateFlags isolate_flags_; |   985   Dart_IsolateFlags isolate_flags_; | 
|  1023   bool paused_; |   986   bool paused_; | 
|  1024   bool errors_are_fatal_; |   987   bool errors_are_fatal_; | 
|  1025 }; |   988 }; | 
|  1026  |   989  | 
|  1027 }  // namespace dart |   990 }  // namespace dart | 
|  1028  |   991  | 
|  1029 #endif  // RUNTIME_VM_ISOLATE_H_ |   992 #endif  // RUNTIME_VM_ISOLATE_H_ | 
| OLD | NEW |