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

Side by Side Diff: src/api.cc

Issue 251014: * Fix memory leaks caused by thread local data being lost.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 2 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/api.h ('k') | src/bootstrapper.h » ('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 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 thread_local.IncrementCallDepth(); \ 64 thread_local.IncrementCallDepth(); \
65 ASSERT(!i::Top::external_caught_exception()); \ 65 ASSERT(!i::Top::external_caught_exception()); \
66 bool has_pending_exception = false 66 bool has_pending_exception = false
67 67
68 68
69 #define EXCEPTION_BAILOUT_CHECK(value) \ 69 #define EXCEPTION_BAILOUT_CHECK(value) \
70 do { \ 70 do { \
71 thread_local.DecrementCallDepth(); \ 71 thread_local.DecrementCallDepth(); \
72 if (has_pending_exception) { \ 72 if (has_pending_exception) { \
73 if (thread_local.CallDepthIsZero() && i::Top::is_out_of_memory()) { \ 73 if (thread_local.CallDepthIsZero() && i::Top::is_out_of_memory()) { \
74 if (!thread_local.IgnoreOutOfMemory()) \ 74 if (!thread_local.ignore_out_of_memory()) \
75 i::V8::FatalProcessOutOfMemory(NULL); \ 75 i::V8::FatalProcessOutOfMemory(NULL); \
76 } \ 76 } \
77 bool call_depth_is_zero = thread_local.CallDepthIsZero(); \ 77 bool call_depth_is_zero = thread_local.CallDepthIsZero(); \
78 i::Top::OptionalRescheduleException(call_depth_is_zero); \ 78 i::Top::OptionalRescheduleException(call_depth_is_zero); \
79 return value; \ 79 return value; \
80 } \ 80 } \
81 } while (false) 81 } while (false)
82 82
83 83
84 #define API_ENTRY_CHECK(msg) \ 84 #define API_ENTRY_CHECK(msg) \
(...skipping 3095 matching lines...) Expand 10 before | Expand all | Expand 10 after
3180 if (i::Smi::IsValid(value)) { 3180 if (i::Smi::IsValid(value)) {
3181 return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value))); 3181 return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value)));
3182 } 3182 }
3183 ENTER_V8; 3183 ENTER_V8;
3184 i::Handle<i::Object> result = i::Factory::NewNumber(value); 3184 i::Handle<i::Object> result = i::Factory::NewNumber(value);
3185 return Utils::IntegerToLocal(result); 3185 return Utils::IntegerToLocal(result);
3186 } 3186 }
3187 3187
3188 3188
3189 void V8::IgnoreOutOfMemoryException() { 3189 void V8::IgnoreOutOfMemoryException() {
3190 thread_local.SetIgnoreOutOfMemory(true); 3190 thread_local.set_ignore_out_of_memory(true);
3191 } 3191 }
3192 3192
3193 3193
3194 bool V8::AddMessageListener(MessageCallback that, Handle<Value> data) { 3194 bool V8::AddMessageListener(MessageCallback that, Handle<Value> data) {
3195 EnsureInitialized("v8::V8::AddMessageListener()"); 3195 EnsureInitialized("v8::V8::AddMessageListener()");
3196 ON_BAILOUT("v8::V8::AddMessageListener()", return false); 3196 ON_BAILOUT("v8::V8::AddMessageListener()", return false);
3197 ENTER_V8; 3197 ENTER_V8;
3198 HandleScope scope; 3198 HandleScope scope;
3199 NeanderArray listeners(i::Factory::message_listeners()); 3199 NeanderArray listeners(i::Factory::message_listeners());
3200 NeanderObject obj(2); 3200 NeanderObject obj(2);
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
3662 #endif // ENABLE_DEBUGGER_SUPPORT 3662 #endif // ENABLE_DEBUGGER_SUPPORT
3663 3663
3664 namespace internal { 3664 namespace internal {
3665 3665
3666 3666
3667 HandleScopeImplementer* HandleScopeImplementer::instance() { 3667 HandleScopeImplementer* HandleScopeImplementer::instance() {
3668 return &thread_local; 3668 return &thread_local;
3669 } 3669 }
3670 3670
3671 3671
3672 void HandleScopeImplementer::FreeThreadResources() {
3673 thread_local.Free();
3674 }
3675
3676
3672 char* HandleScopeImplementer::ArchiveThread(char* storage) { 3677 char* HandleScopeImplementer::ArchiveThread(char* storage) {
3673 return thread_local.ArchiveThreadHelper(storage); 3678 return thread_local.ArchiveThreadHelper(storage);
3674 } 3679 }
3675 3680
3676 3681
3677 char* HandleScopeImplementer::ArchiveThreadHelper(char* storage) { 3682 char* HandleScopeImplementer::ArchiveThreadHelper(char* storage) {
3678 v8::ImplementationUtilities::HandleScopeData* current = 3683 v8::ImplementationUtilities::HandleScopeData* current =
3679 v8::ImplementationUtilities::CurrentHandleScope(); 3684 v8::ImplementationUtilities::CurrentHandleScope();
3680 handle_scope_data_ = *current; 3685 handle_scope_data_ = *current;
3681 memcpy(storage, this, sizeof(*this)); 3686 memcpy(storage, this, sizeof(*this));
(...skipping 17 matching lines...) Expand all
3699 3704
3700 char* HandleScopeImplementer::RestoreThreadHelper(char* storage) { 3705 char* HandleScopeImplementer::RestoreThreadHelper(char* storage) {
3701 memcpy(this, storage, sizeof(*this)); 3706 memcpy(this, storage, sizeof(*this));
3702 *v8::ImplementationUtilities::CurrentHandleScope() = handle_scope_data_; 3707 *v8::ImplementationUtilities::CurrentHandleScope() = handle_scope_data_;
3703 return storage + ArchiveSpacePerThread(); 3708 return storage + ArchiveSpacePerThread();
3704 } 3709 }
3705 3710
3706 3711
3707 void HandleScopeImplementer::IterateThis(ObjectVisitor* v) { 3712 void HandleScopeImplementer::IterateThis(ObjectVisitor* v) {
3708 // Iterate over all handles in the blocks except for the last. 3713 // Iterate over all handles in the blocks except for the last.
3709 for (int i = Blocks()->length() - 2; i >= 0; --i) { 3714 for (int i = blocks()->length() - 2; i >= 0; --i) {
3710 Object** block = Blocks()->at(i); 3715 Object** block = blocks()->at(i);
3711 v->VisitPointers(block, &block[kHandleBlockSize]); 3716 v->VisitPointers(block, &block[kHandleBlockSize]);
3712 } 3717 }
3713 3718
3714 // Iterate over live handles in the last block (if any). 3719 // Iterate over live handles in the last block (if any).
3715 if (!Blocks()->is_empty()) { 3720 if (!blocks()->is_empty()) {
3716 v->VisitPointers(Blocks()->last(), handle_scope_data_.next); 3721 v->VisitPointers(blocks()->last(), handle_scope_data_.next);
3717 } 3722 }
3718 3723
3719 if (!saved_contexts_.is_empty()) { 3724 if (!saved_contexts_.is_empty()) {
3720 Object** start = reinterpret_cast<Object**>(&saved_contexts_.first()); 3725 Object** start = reinterpret_cast<Object**>(&saved_contexts_.first());
3721 v->VisitPointers(start, start + saved_contexts_.length()); 3726 v->VisitPointers(start, start + saved_contexts_.length());
3722 } 3727 }
3723 } 3728 }
3724 3729
3725 3730
3726 void HandleScopeImplementer::Iterate(ObjectVisitor* v) { 3731 void HandleScopeImplementer::Iterate(ObjectVisitor* v) {
3727 v8::ImplementationUtilities::HandleScopeData* current = 3732 v8::ImplementationUtilities::HandleScopeData* current =
3728 v8::ImplementationUtilities::CurrentHandleScope(); 3733 v8::ImplementationUtilities::CurrentHandleScope();
3729 thread_local.handle_scope_data_ = *current; 3734 thread_local.handle_scope_data_ = *current;
3730 thread_local.IterateThis(v); 3735 thread_local.IterateThis(v);
3731 } 3736 }
3732 3737
3733 3738
3734 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { 3739 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) {
3735 HandleScopeImplementer* thread_local = 3740 HandleScopeImplementer* thread_local =
3736 reinterpret_cast<HandleScopeImplementer*>(storage); 3741 reinterpret_cast<HandleScopeImplementer*>(storage);
3737 thread_local->IterateThis(v); 3742 thread_local->IterateThis(v);
3738 return storage + ArchiveSpacePerThread(); 3743 return storage + ArchiveSpacePerThread();
3739 } 3744 }
3740 3745
3741 } } // namespace v8::internal 3746 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/api.h ('k') | src/bootstrapper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698