| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 // makeConsistentForMutator() drops marks from marked objects and rebuild | 286 // makeConsistentForMutator() drops marks from marked objects and rebuild |
| 287 // free lists. This is called after taking a snapshot and before resuming | 287 // free lists. This is called after taking a snapshot and before resuming |
| 288 // the executions of mutators. | 288 // the executions of mutators. |
| 289 void makeConsistentForMutator(); | 289 void makeConsistentForMutator(); |
| 290 | 290 |
| 291 // Support for disallowing allocation. Mainly used for sanity | 291 // Support for disallowing allocation. Mainly used for sanity |
| 292 // checks asserts. | 292 // checks asserts. |
| 293 bool isAllocationAllowed() const { return !isAtSafePoint() && !m_noAllocatio
nCount; } | 293 bool isAllocationAllowed() const { return !isAtSafePoint() && !m_noAllocatio
nCount; } |
| 294 void enterNoAllocationScope() { m_noAllocationCount++; } | 294 void enterNoAllocationScope() { m_noAllocationCount++; } |
| 295 void leaveNoAllocationScope() { m_noAllocationCount--; } | 295 void leaveNoAllocationScope() { m_noAllocationCount--; } |
| 296 bool isGCForbidden() const { return m_gcForbiddenCount; } | 296 |
| 297 // By entering a gc-forbidden scope, conservative GCs will not |
| 298 // be allowed while handling an out-of-line allocation request. |
| 299 // Intended used when constructing subclasses of GC mixins, where |
| 300 // the object being constructed cannot be safely traced & marked |
| 301 // fully should a GC be allowed while its subclasses are being |
| 302 // constructed. |
| 303 bool isGCForbidden() const { return m_gcForbiddenCount || isConstructingGCMi
xin(); } |
| 297 void enterGCForbiddenScope() { m_gcForbiddenCount++; } | 304 void enterGCForbiddenScope() { m_gcForbiddenCount++; } |
| 298 void leaveGCForbiddenScope() | 305 void leaveGCForbiddenScope() |
| 299 { | 306 { |
| 300 ASSERT(m_gcForbiddenCount > 0); | 307 ASSERT(m_gcForbiddenCount > 0); |
| 301 m_gcForbiddenCount--; | 308 m_gcForbiddenCount--; |
| 302 } | 309 } |
| 303 bool sweepForbidden() const { return m_sweepForbidden; } | 310 bool sweepForbidden() const { return m_sweepForbidden; } |
| 304 | 311 |
| 312 bool isConstructingGCMixin() const { return m_gcMixinMarker; } |
| 313 void startConstructingGCMixin(GarbageCollectedMixinConstructorMarker* gcMixi
nMarker) |
| 314 { |
| 315 ASSERT(checkThread()); |
| 316 if (!m_gcMixinMarker) { |
| 317 m_gcMixinMarker = gcMixinMarker; |
| 318 } |
| 319 } |
| 320 void finishConstructingGCMixin(GarbageCollectedMixinConstructorMarker* gcMix
inMarker) |
| 321 { |
| 322 ASSERT(checkThread()); |
| 323 if (m_gcMixinMarker == gcMixinMarker) { |
| 324 m_gcMixinMarker = nullptr; |
| 325 } |
| 326 } |
| 327 |
| 305 void flushHeapDoesNotContainCacheIfNeeded(); | 328 void flushHeapDoesNotContainCacheIfNeeded(); |
| 306 | 329 |
| 307 // Safepoint related functionality. | 330 // Safepoint related functionality. |
| 308 // | 331 // |
| 309 // When a thread attempts to perform GC it needs to stop all other threads | 332 // When a thread attempts to perform GC it needs to stop all other threads |
| 310 // that use the heap or at least guarantee that they will not touch any | 333 // that use the heap or at least guarantee that they will not touch any |
| 311 // heap allocated object until GC is complete. | 334 // heap allocated object until GC is complete. |
| 312 // | 335 // |
| 313 // We say that a thread is at a safepoint if this thread is guaranteed to | 336 // We say that a thread is at a safepoint if this thread is guaranteed to |
| 314 // not touch any heap allocated object or any heap related functionality unt
il | 337 // not touch any heap allocated object or any heap related functionality unt
il |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 } | 447 } |
| 425 | 448 |
| 426 void shouldFlushHeapDoesNotContainCache() { m_shouldFlushHeapDoesNotContainC
ache = true; } | 449 void shouldFlushHeapDoesNotContainCache() { m_shouldFlushHeapDoesNotContainC
ache = true; } |
| 427 | 450 |
| 428 void registerTraceDOMWrappers(v8::Isolate* isolate, void (*traceDOMWrappers)
(v8::Isolate*, Visitor*)) | 451 void registerTraceDOMWrappers(v8::Isolate* isolate, void (*traceDOMWrappers)
(v8::Isolate*, Visitor*)) |
| 429 { | 452 { |
| 430 m_isolate = isolate; | 453 m_isolate = isolate; |
| 431 m_traceDOMWrappers = traceDOMWrappers; | 454 m_traceDOMWrappers = traceDOMWrappers; |
| 432 } | 455 } |
| 433 | 456 |
| 434 // By entering a gc-forbidden scope, conservative GCs will not | |
| 435 // be allowed while handling an out-of-line allocation request. | |
| 436 // Intended used when constructing subclasses of GC mixins, where | |
| 437 // the object being constructed cannot be safely traced & marked | |
| 438 // fully should a GC be allowed while its subclasses are being | |
| 439 // constructed. | |
| 440 void enterGCForbiddenScopeIfNeeded(GarbageCollectedMixinConstructorMarker* g
cMixinMarker) | |
| 441 { | |
| 442 ASSERT(checkThread()); | |
| 443 if (!m_gcMixinMarker) { | |
| 444 enterGCForbiddenScope(); | |
| 445 m_gcMixinMarker = gcMixinMarker; | |
| 446 } | |
| 447 } | |
| 448 void leaveGCForbiddenScopeIfNeeded(GarbageCollectedMixinConstructorMarker* g
cMixinMarker) | |
| 449 { | |
| 450 ASSERT(checkThread()); | |
| 451 if (m_gcMixinMarker == gcMixinMarker) { | |
| 452 leaveGCForbiddenScope(); | |
| 453 m_gcMixinMarker = nullptr; | |
| 454 } | |
| 455 } | |
| 456 | |
| 457 // vectorBackingHeap() returns a heap that the vector allocation should use. | 457 // vectorBackingHeap() returns a heap that the vector allocation should use. |
| 458 // We have four vector heaps and want to choose the best heap here. | 458 // We have four vector heaps and want to choose the best heap here. |
| 459 // | 459 // |
| 460 // The goal is to improve the succession rate where expand and | 460 // The goal is to improve the succession rate where expand and |
| 461 // promptlyFree happen at an allocation point. This is a key for reusing | 461 // promptlyFree happen at an allocation point. This is a key for reusing |
| 462 // the same memory as much as possible and thus improves performance. | 462 // the same memory as much as possible and thus improves performance. |
| 463 // To achieve the goal, we use the following heuristics: | 463 // To achieve the goal, we use the following heuristics: |
| 464 // | 464 // |
| 465 // - A vector that has been expanded recently is likely to be expanded | 465 // - A vector that has been expanded recently is likely to be expanded |
| 466 // again soon. | 466 // again soon. |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 }; | 674 }; |
| 675 | 675 |
| 676 template<> class ThreadStateFor<AnyThread> { | 676 template<> class ThreadStateFor<AnyThread> { |
| 677 public: | 677 public: |
| 678 static ThreadState* state() { return ThreadState::current(); } | 678 static ThreadState* state() { return ThreadState::current(); } |
| 679 }; | 679 }; |
| 680 | 680 |
| 681 } // namespace blink | 681 } // namespace blink |
| 682 | 682 |
| 683 #endif // ThreadState_h | 683 #endif // ThreadState_h |
| OLD | NEW |