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

Side by Side Diff: src/isolate.h

Issue 7572018: Minimize malloc heap allocation on process startup. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/execution.cc ('k') | src/isolate.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 Address js_entry_sp_; // the stack pointer of the bottom js entry frame 249 Address js_entry_sp_; // the stack pointer of the bottom js entry frame
250 Address external_callback_; // the external callback we're currently in 250 Address external_callback_; // the external callback we're currently in
251 StateTag current_vm_state_; 251 StateTag current_vm_state_;
252 252
253 // Generated code scratch locations. 253 // Generated code scratch locations.
254 int32_t formal_count_; 254 int32_t formal_count_;
255 255
256 // Call back function to report unsafe JS accesses. 256 // Call back function to report unsafe JS accesses.
257 v8::FailedAccessCheckCallback failed_access_check_callback_; 257 v8::FailedAccessCheckCallback failed_access_check_callback_;
258 258
259 // Whether out of memory exceptions should be ignored.
260 bool ignore_out_of_memory_;
261
259 private: 262 private:
260 void InitializeInternal(); 263 void InitializeInternal();
261 264
262 Address try_catch_handler_address_; 265 Address try_catch_handler_address_;
263 }; 266 };
264 267
265 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) 268 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS)
266 269
267 #define ISOLATE_PLATFORM_INIT_LIST(V) \ 270 #define ISOLATE_PLATFORM_INIT_LIST(V) \
268 /* VirtualFrame::SpilledScope state */ \ 271 /* VirtualFrame::SpilledScope state */ \
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 Isolate* isolate = reinterpret_cast<Isolate*>( 442 Isolate* isolate = reinterpret_cast<Isolate*>(
440 Thread::GetExistingThreadLocal(isolate_key_)); 443 Thread::GetExistingThreadLocal(isolate_key_));
441 ASSERT(isolate != NULL); 444 ASSERT(isolate != NULL);
442 return isolate; 445 return isolate;
443 } 446 }
444 447
445 INLINE(static Isolate* UncheckedCurrent()) { 448 INLINE(static Isolate* UncheckedCurrent()) {
446 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_)); 449 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_));
447 } 450 }
448 451
452 // Usually called by Init(), but can be called early e.g. to allow
453 // testing components that require logging but not the whole
454 // isolate.
455 //
456 // Safe to call more than once.
457 void InitializeLoggingAndCounters();
458
449 bool Init(Deserializer* des); 459 bool Init(Deserializer* des);
450 460
451 bool IsInitialized() { return state_ == INITIALIZED; } 461 bool IsInitialized() { return state_ == INITIALIZED; }
452 462
453 // True if at least one thread Enter'ed this isolate. 463 // True if at least one thread Enter'ed this isolate.
454 bool IsInUse() { return entry_stack_ != NULL; } 464 bool IsInUse() { return entry_stack_ != NULL; }
455 465
456 // Destroys the non-default isolates. 466 // Destroys the non-default isolates.
457 // Sets default isolate into "has_been_disposed" state rather then destroying, 467 // Sets default isolate into "has_been_disposed" state rather then destroying,
458 // for legacy API reasons. 468 // for legacy API reasons.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 static Thread::LocalStorageKey thread_id_key() { 501 static Thread::LocalStorageKey thread_id_key() {
492 return thread_id_key_; 502 return thread_id_key_;
493 } 503 }
494 504
495 // If a client attempts to create a Locker without specifying an isolate, 505 // If a client attempts to create a Locker without specifying an isolate,
496 // we assume that the client is using legacy behavior. Set up the current 506 // we assume that the client is using legacy behavior. Set up the current
497 // thread to be inside the implicit isolate (or fail a check if we have 507 // thread to be inside the implicit isolate (or fail a check if we have
498 // switched to non-legacy behavior). 508 // switched to non-legacy behavior).
499 static void EnterDefaultIsolate(); 509 static void EnterDefaultIsolate();
500 510
501 // Debug.
502 // Mutex for serializing access to break control structures. 511 // Mutex for serializing access to break control structures.
503 Mutex* break_access() { return break_access_; } 512 Mutex* break_access() { return break_access_; }
504 513
514 // Mutex for serializing access to debugger.
515 Mutex* debugger_access() { return debugger_access_; }
516
505 Address get_address_from_id(AddressId id); 517 Address get_address_from_id(AddressId id);
506 518
507 // Access to top context (where the current function object was created). 519 // Access to top context (where the current function object was created).
508 Context* context() { return thread_local_top_.context_; } 520 Context* context() { return thread_local_top_.context_; }
509 void set_context(Context* context) { 521 void set_context(Context* context) {
510 ASSERT(context == NULL || context->IsContext()); 522 ASSERT(context == NULL || context->IsContext());
511 thread_local_top_.context_ = context; 523 thread_local_top_.context_ = context;
512 } 524 }
513 Context** context_address() { return &thread_local_top_.context_; } 525 Context** context_address() { return &thread_local_top_.context_; }
514 526
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 }; 666 };
655 667
656 void SetCaptureStackTraceForUncaughtExceptions( 668 void SetCaptureStackTraceForUncaughtExceptions(
657 bool capture, 669 bool capture,
658 int frame_limit, 670 int frame_limit,
659 StackTrace::StackTraceOptions options); 671 StackTrace::StackTraceOptions options);
660 672
661 // Tells whether the current context has experienced an out of memory 673 // Tells whether the current context has experienced an out of memory
662 // exception. 674 // exception.
663 bool is_out_of_memory(); 675 bool is_out_of_memory();
676 bool ignore_out_of_memory() {
677 return thread_local_top_.ignore_out_of_memory_;
678 }
679 void set_ignore_out_of_memory(bool value) {
680 thread_local_top_.ignore_out_of_memory_ = value;
681 }
664 682
665 void PrintCurrentStackTrace(FILE* out); 683 void PrintCurrentStackTrace(FILE* out);
666 void PrintStackTrace(FILE* out, char* thread_data); 684 void PrintStackTrace(FILE* out, char* thread_data);
667 void PrintStack(StringStream* accumulator); 685 void PrintStack(StringStream* accumulator);
668 void PrintStack(); 686 void PrintStack();
669 Handle<String> StackTraceString(); 687 Handle<String> StackTraceString();
670 Handle<JSArray> CaptureCurrentStackTrace( 688 Handle<JSArray> CaptureCurrentStackTrace(
671 int frame_limit, 689 int frame_limit,
672 StackTrace::StackTraceOptions options); 690 StackTrace::StackTraceOptions options);
673 691
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 #undef GLOBAL_ARRAY_ACCESSOR 780 #undef GLOBAL_ARRAY_ACCESSOR
763 781
764 #define GLOBAL_CONTEXT_FIELD_ACCESSOR(index, type, name) \ 782 #define GLOBAL_CONTEXT_FIELD_ACCESSOR(index, type, name) \
765 Handle<type> name() { \ 783 Handle<type> name() { \
766 return Handle<type>(context()->global_context()->name()); \ 784 return Handle<type>(context()->global_context()->name()); \
767 } 785 }
768 GLOBAL_CONTEXT_FIELDS(GLOBAL_CONTEXT_FIELD_ACCESSOR) 786 GLOBAL_CONTEXT_FIELDS(GLOBAL_CONTEXT_FIELD_ACCESSOR)
769 #undef GLOBAL_CONTEXT_FIELD_ACCESSOR 787 #undef GLOBAL_CONTEXT_FIELD_ACCESSOR
770 788
771 Bootstrapper* bootstrapper() { return bootstrapper_; } 789 Bootstrapper* bootstrapper() { return bootstrapper_; }
772 Counters* counters() { return counters_; } 790 Counters* counters() {
791 // Call InitializeLoggingAndCounters() if logging is needed before
792 // the isolate is fully initialized.
793 ASSERT(counters_ != NULL);
794 return counters_;
795 }
773 CodeRange* code_range() { return code_range_; } 796 CodeRange* code_range() { return code_range_; }
774 RuntimeProfiler* runtime_profiler() { return runtime_profiler_; } 797 RuntimeProfiler* runtime_profiler() { return runtime_profiler_; }
775 CompilationCache* compilation_cache() { return compilation_cache_; } 798 CompilationCache* compilation_cache() { return compilation_cache_; }
776 Logger* logger() { return logger_; } 799 Logger* logger() {
800 // Call InitializeLoggingAndCounters() if logging is needed before
801 // the isolate is fully initialized.
802 ASSERT(logger_ != NULL);
803 return logger_;
804 }
777 StackGuard* stack_guard() { return &stack_guard_; } 805 StackGuard* stack_guard() { return &stack_guard_; }
778 Heap* heap() { return &heap_; } 806 Heap* heap() { return &heap_; }
779 StatsTable* stats_table() { return stats_table_; } 807 StatsTable* stats_table();
780 StubCache* stub_cache() { return stub_cache_; } 808 StubCache* stub_cache() { return stub_cache_; }
781 DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; } 809 DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; }
782 ThreadLocalTop* thread_local_top() { return &thread_local_top_; } 810 ThreadLocalTop* thread_local_top() { return &thread_local_top_; }
783 811
784 TranscendentalCache* transcendental_cache() const { 812 TranscendentalCache* transcendental_cache() const {
785 return transcendental_cache_; 813 return transcendental_cache_;
786 } 814 }
787 815
788 MemoryAllocator* memory_allocator() { 816 MemoryAllocator* memory_allocator() {
789 return memory_allocator_; 817 return memory_allocator_;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 unibrow::Mapping<unibrow::Ecma262Canonicalize>* 898 unibrow::Mapping<unibrow::Ecma262Canonicalize>*
871 interp_canonicalize_mapping() { 899 interp_canonicalize_mapping() {
872 return &interp_canonicalize_mapping_; 900 return &interp_canonicalize_mapping_;
873 } 901 }
874 902
875 void* PreallocatedStorageNew(size_t size); 903 void* PreallocatedStorageNew(size_t size);
876 void PreallocatedStorageDelete(void* p); 904 void PreallocatedStorageDelete(void* p);
877 void PreallocatedStorageInit(size_t size); 905 void PreallocatedStorageInit(size_t size);
878 906
879 #ifdef ENABLE_DEBUGGER_SUPPORT 907 #ifdef ENABLE_DEBUGGER_SUPPORT
880 Debugger* debugger() { return debugger_; } 908 Debugger* debugger() {
881 Debug* debug() { return debug_; } 909 if (!NoBarrier_Load(&debugger_initialized_)) InitializeDebugger();
910 return debugger_;
911 }
912 Debug* debug() {
913 if (!NoBarrier_Load(&debugger_initialized_)) InitializeDebugger();
914 return debug_;
915 }
882 #endif 916 #endif
883 917
884 inline bool DebuggerHasBreakPoints(); 918 inline bool DebuggerHasBreakPoints();
885 919
886 #ifdef DEBUG 920 #ifdef DEBUG
887 HistogramInfo* heap_histograms() { return heap_histograms_; } 921 HistogramInfo* heap_histograms() { return heap_histograms_; }
888 922
889 JSObject::SpillInformation* js_spill_information() { 923 JSObject::SpillInformation* js_spill_information() {
890 return &js_spill_information_; 924 return &js_spill_information_;
891 } 925 }
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 // This mutex protects highest_thread_id_, thread_data_table_ and 1037 // This mutex protects highest_thread_id_, thread_data_table_ and
1004 // default_isolate_. 1038 // default_isolate_.
1005 static Mutex* process_wide_mutex_; 1039 static Mutex* process_wide_mutex_;
1006 1040
1007 static Thread::LocalStorageKey per_isolate_thread_data_key_; 1041 static Thread::LocalStorageKey per_isolate_thread_data_key_;
1008 static Thread::LocalStorageKey isolate_key_; 1042 static Thread::LocalStorageKey isolate_key_;
1009 static Thread::LocalStorageKey thread_id_key_; 1043 static Thread::LocalStorageKey thread_id_key_;
1010 static Isolate* default_isolate_; 1044 static Isolate* default_isolate_;
1011 static ThreadDataTable* thread_data_table_; 1045 static ThreadDataTable* thread_data_table_;
1012 1046
1013 bool PreInit();
1014
1015 void Deinit(); 1047 void Deinit();
1016 1048
1017 static void SetIsolateThreadLocals(Isolate* isolate, 1049 static void SetIsolateThreadLocals(Isolate* isolate,
1018 PerIsolateThreadData* data); 1050 PerIsolateThreadData* data);
1019 1051
1020 enum State { 1052 enum State {
1021 UNINITIALIZED, // Some components may not have been allocated. 1053 UNINITIALIZED, // Some components may not have been allocated.
1022 PREINITIALIZED, // Components have been allocated but not initialized.
1023 INITIALIZED // All components are fully initialized. 1054 INITIALIZED // All components are fully initialized.
1024 }; 1055 };
1025 1056
1026 State state_; 1057 State state_;
1027 EntryStackItem* entry_stack_; 1058 EntryStackItem* entry_stack_;
1028 1059
1029 // Allocate and insert PerIsolateThreadData into the ThreadDataTable 1060 // Allocate and insert PerIsolateThreadData into the ThreadDataTable
1030 // (regardless of whether such data already exists). 1061 // (regardless of whether such data already exists).
1031 PerIsolateThreadData* AllocatePerIsolateThreadData(ThreadId thread_id); 1062 PerIsolateThreadData* AllocatePerIsolateThreadData(ThreadId thread_id);
1032 1063
(...skipping 23 matching lines...) Expand all
1056 void PrintStackTrace(FILE* out, ThreadLocalTop* thread); 1087 void PrintStackTrace(FILE* out, ThreadLocalTop* thread);
1057 void MarkCompactPrologue(bool is_compacting, 1088 void MarkCompactPrologue(bool is_compacting,
1058 ThreadLocalTop* archived_thread_data); 1089 ThreadLocalTop* archived_thread_data);
1059 void MarkCompactEpilogue(bool is_compacting, 1090 void MarkCompactEpilogue(bool is_compacting,
1060 ThreadLocalTop* archived_thread_data); 1091 ThreadLocalTop* archived_thread_data);
1061 1092
1062 void FillCache(); 1093 void FillCache();
1063 1094
1064 void PropagatePendingExceptionToExternalTryCatch(); 1095 void PropagatePendingExceptionToExternalTryCatch();
1065 1096
1097 void InitializeDebugger();
1098
1066 int stack_trace_nesting_level_; 1099 int stack_trace_nesting_level_;
1067 StringStream* incomplete_message_; 1100 StringStream* incomplete_message_;
1068 // The preallocated memory thread singleton. 1101 // The preallocated memory thread singleton.
1069 PreallocatedMemoryThread* preallocated_memory_thread_; 1102 PreallocatedMemoryThread* preallocated_memory_thread_;
1070 Address isolate_addresses_[k_isolate_address_count + 1]; // NOLINT 1103 Address isolate_addresses_[k_isolate_address_count + 1]; // NOLINT
1071 NoAllocationStringAllocator* preallocated_message_space_; 1104 NoAllocationStringAllocator* preallocated_message_space_;
1072 1105
1073 Bootstrapper* bootstrapper_; 1106 Bootstrapper* bootstrapper_;
1074 RuntimeProfiler* runtime_profiler_; 1107 RuntimeProfiler* runtime_profiler_;
1075 CompilationCache* compilation_cache_; 1108 CompilationCache* compilation_cache_;
1076 Counters* counters_; 1109 Counters* counters_;
1077 CodeRange* code_range_; 1110 CodeRange* code_range_;
1078 Mutex* break_access_; 1111 Mutex* break_access_;
1112 Atomic32 debugger_initialized_;
1113 Mutex* debugger_access_;
1079 Heap heap_; 1114 Heap heap_;
1080 Logger* logger_; 1115 Logger* logger_;
1081 StackGuard stack_guard_; 1116 StackGuard stack_guard_;
1082 StatsTable* stats_table_; 1117 StatsTable* stats_table_;
1083 StubCache* stub_cache_; 1118 StubCache* stub_cache_;
1084 DeoptimizerData* deoptimizer_data_; 1119 DeoptimizerData* deoptimizer_data_;
1085 ThreadLocalTop thread_local_top_; 1120 ThreadLocalTop thread_local_top_;
1086 bool capture_stack_trace_for_uncaught_exceptions_; 1121 bool capture_stack_trace_for_uncaught_exceptions_;
1087 int stack_trace_for_uncaught_exceptions_frame_limit_; 1122 int stack_trace_for_uncaught_exceptions_frame_limit_;
1088 StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_; 1123 StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 1193 ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
1159 #undef ISOLATE_FIELD_OFFSET 1194 #undef ISOLATE_FIELD_OFFSET
1160 #endif 1195 #endif
1161 1196
1162 friend class ExecutionAccess; 1197 friend class ExecutionAccess;
1163 friend class IsolateInitializer; 1198 friend class IsolateInitializer;
1164 friend class ThreadManager; 1199 friend class ThreadManager;
1165 friend class Simulator; 1200 friend class Simulator;
1166 friend class StackGuard; 1201 friend class StackGuard;
1167 friend class ThreadId; 1202 friend class ThreadId;
1203 friend class TestMemoryAllocatorScope;
1168 friend class v8::Isolate; 1204 friend class v8::Isolate;
1169 friend class v8::Locker; 1205 friend class v8::Locker;
1170 friend class v8::Unlocker; 1206 friend class v8::Unlocker;
1171 1207
1172 DISALLOW_COPY_AND_ASSIGN(Isolate); 1208 DISALLOW_COPY_AND_ASSIGN(Isolate);
1173 }; 1209 };
1174 1210
1175 1211
1176 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the 1212 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the
1177 // class as a work around for a bug in the generated code found with these 1213 // class as a work around for a bug in the generated code found with these
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 1357
1322 // Mark the global context with out of memory. 1358 // Mark the global context with out of memory.
1323 inline void Context::mark_out_of_memory() { 1359 inline void Context::mark_out_of_memory() {
1324 global_context()->set_out_of_memory(HEAP->true_value()); 1360 global_context()->set_out_of_memory(HEAP->true_value());
1325 } 1361 }
1326 1362
1327 1363
1328 } } // namespace v8::internal 1364 } } // namespace v8::internal
1329 1365
1330 #endif // V8_ISOLATE_H_ 1366 #endif // V8_ISOLATE_H_
OLDNEW
« no previous file with comments | « src/execution.cc ('k') | src/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698