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

Side by Side Diff: src/handles-inl.h

Issue 15691017: Make assertion scopes thread safe. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 6 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
« src/api.cc ('K') | « src/handles.cc ('k') | src/heap.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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 71
72 template <typename T> 72 template <typename T>
73 inline T** Handle<T>::location() const { 73 inline T** Handle<T>::location() const {
74 ASSERT(location_ == NULL || !(*location_)->IsFailure()); 74 ASSERT(location_ == NULL || !(*location_)->IsFailure());
75 SLOW_ASSERT(location_ == NULL || IsDereferenceAllowed(false)); 75 SLOW_ASSERT(location_ == NULL || IsDereferenceAllowed(false));
76 return location_; 76 return location_;
77 } 77 }
78 78
79 #ifdef DEBUG 79 #ifdef DEBUG
80 template <typename T> 80 template <typename T>
81 bool Handle<T>::IsDereferenceAllowed(bool allow_deferred) const { 81 bool Handle<T>::IsDereferenceAllowed(bool explicitly_allow_deferred) const {
82 ASSERT(location_ != NULL); 82 ASSERT(location_ != NULL);
83 Object* object = *BitCast<T**>(location_); 83 Object* object = *BitCast<T**>(location_);
84 if (object->IsSmi()) return true; 84 if (object->IsSmi()) return true;
85 HeapObject* heap_object = HeapObject::cast(object); 85 HeapObject* heap_object = HeapObject::cast(object);
86 Isolate* isolate = heap_object->GetIsolate(); 86 Isolate* isolate = heap_object->GetIsolate();
87 Object** handle = reinterpret_cast<Object**>(location_); 87 Object** handle = reinterpret_cast<Object**>(location_);
88 Object** roots_array_start = isolate->heap()->roots_array_start(); 88 Object** roots_array_start = isolate->heap()->roots_array_start();
89 if (roots_array_start <= handle && 89 if (roots_array_start <= handle &&
90 handle < roots_array_start + Heap::kStrongRootListLength) { 90 handle < roots_array_start + Heap::kStrongRootListLength) {
91 return true; 91 return true;
92 } 92 }
93 if (isolate->optimizing_compiler_thread()->IsOptimizerThread() && 93 if (!AllowHandleDereference::IsAllowed()) return false;
94 !Heap::RelocationLock::IsLockedByOptimizerThread(isolate->heap())) { 94 if (!explicitly_allow_deferred &&
95 return false; 95 !AllowDeferredHandleDereference::IsAllowed()) {
96 // Accessing maps and internalized strings is safe.
97 if (heap_object->IsMap()) return true;
98 if (heap_object->IsInternalizedString()) return true;
99 return !isolate->IsDeferredHandle(handle);
96 } 100 }
97 switch (isolate->HandleDereferenceGuardState()) { 101 return true;
98 case HandleDereferenceGuard::ALLOW:
99 return true;
100 case HandleDereferenceGuard::DISALLOW:
101 return false;
102 case HandleDereferenceGuard::DISALLOW_DEFERRED:
103 // Accessing maps and internalized strings is safe.
104 if (heap_object->IsMap()) return true;
105 if (heap_object->IsInternalizedString()) return true;
106 return allow_deferred || !isolate->IsDeferredHandle(handle);
107 }
108 return false;
109 } 102 }
110 #endif 103 #endif
111 104
112 105
113 106
114 HandleScope::HandleScope(Isolate* isolate) { 107 HandleScope::HandleScope(Isolate* isolate) {
115 v8::ImplementationUtilities::HandleScopeData* current = 108 v8::ImplementationUtilities::HandleScopeData* current =
116 isolate->handle_scope_data(); 109 isolate->handle_scope_data();
117 isolate_ = isolate; 110 isolate_ = isolate;
118 prev_next_ = current->next; 111 prev_next_ = current->next;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 // to be used or closed again). 153 // to be used or closed again).
161 prev_next_ = current->next; 154 prev_next_ = current->next;
162 prev_limit_ = current->limit; 155 prev_limit_ = current->limit;
163 current->level++; 156 current->level++;
164 return result; 157 return result;
165 } 158 }
166 159
167 160
168 template <typename T> 161 template <typename T>
169 T** HandleScope::CreateHandle(Isolate* isolate, T* value) { 162 T** HandleScope::CreateHandle(Isolate* isolate, T* value) {
163 ASSERT(AllowHandleAllocation::IsAllowed());
170 v8::ImplementationUtilities::HandleScopeData* current = 164 v8::ImplementationUtilities::HandleScopeData* current =
171 isolate->handle_scope_data(); 165 isolate->handle_scope_data();
172 166
173 internal::Object** cur = current->next; 167 internal::Object** cur = current->next;
174 if (cur == current->limit) cur = Extend(isolate); 168 if (cur == current->limit) cur = Extend(isolate);
175 // Update the current next field, set the value in the created 169 // Update the current next field, set the value in the created
176 // handle, and return the result. 170 // handle, and return the result.
177 ASSERT(cur < current->limit); 171 ASSERT(cur < current->limit);
178 current->next = cur + 1; 172 current->next = cur + 1;
179 173
180 T** result = reinterpret_cast<T**>(cur); 174 T** result = reinterpret_cast<T**>(cur);
181 *result = value; 175 *result = value;
182 return result; 176 return result;
183 } 177 }
184 178
185 179
186 #ifdef DEBUG 180 #ifdef DEBUG
187 inline NoHandleAllocation::NoHandleAllocation(Isolate* isolate) 181 inline SealHandleScope::SealHandleScope(Isolate* isolate) : isolate_(isolate) {
188 : isolate_(isolate) { 182 // Make sure the current thread is allowed to create handles to begin with.
189 active_ = !isolate->optimizing_compiler_thread()->IsOptimizerThread(); 183 CHECK(AllowHandleAllocation::IsAllowed());
190 if (active_) { 184 v8::ImplementationUtilities::HandleScopeData* current =
191 // Shrink the current handle scope to make it impossible to do 185 isolate_->handle_scope_data();
192 // handle allocations without an explicit handle scope. 186 // Shrink the current handle scope to make it impossible to do
193 v8::ImplementationUtilities::HandleScopeData* current = 187 // handle allocations without an explicit handle scope.
194 isolate_->handle_scope_data(); 188 current->limit = current->next;
195 limit_ = current->limit; 189
196 current->limit = current->next; 190 level_ = current->level;
197 level_ = current->level; 191 current->level = 0;
198 current->level = 0;
199 }
200 } 192 }
201 193
202 194
203 inline NoHandleAllocation::~NoHandleAllocation() { 195 inline SealHandleScope::~SealHandleScope() {
204 if (active_) { 196 // Restore state in current handle scope to re-enable handle
205 // Restore state in current handle scope to re-enable handle 197 // allocations.
206 // allocations. 198 v8::ImplementationUtilities::HandleScopeData* data =
207 v8::ImplementationUtilities::HandleScopeData* current = 199 isolate_->handle_scope_data();
208 isolate_->handle_scope_data(); 200 ASSERT_EQ(0, data->level);
209 ASSERT_EQ(0, current->level); 201 data->level = level_;
210 current->level = level_;
211 ASSERT_EQ(current->next, current->limit);
212 current->limit = limit_;
213 }
214 }
215
216
217 HandleDereferenceGuard::HandleDereferenceGuard(Isolate* isolate, State state)
218 : isolate_(isolate) {
219 old_state_ = isolate_->HandleDereferenceGuardState();
220 isolate_->SetHandleDereferenceGuardState(state);
221 }
222
223
224 HandleDereferenceGuard::~HandleDereferenceGuard() {
225 isolate_->SetHandleDereferenceGuardState(old_state_);
226 } 202 }
227 203
228 #endif 204 #endif
229 205
230 } } // namespace v8::internal 206 } } // namespace v8::internal
231 207
232 #endif // V8_HANDLES_INL_H_ 208 #endif // V8_HANDLES_INL_H_
OLDNEW
« src/api.cc ('K') | « src/handles.cc ('k') | src/heap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698