OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 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 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(Persistent); | 287 WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(Persistent); |
288 WTF_DISALLOW_ZERO_ASSIGNMENT(Persistent); | 288 WTF_DISALLOW_ZERO_ASSIGNMENT(Persistent); |
289 public: | 289 public: |
290 Persistent() : m_raw(0) { } | 290 Persistent() : m_raw(0) { } |
291 | 291 |
292 Persistent(std::nullptr_t) : m_raw(0) { } | 292 Persistent(std::nullptr_t) : m_raw(0) { } |
293 | 293 |
294 Persistent(T* raw) : m_raw(raw) | 294 Persistent(T* raw) : m_raw(raw) |
295 { | 295 { |
296 ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); | 296 ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); |
| 297 recordBacktrace(); |
297 } | 298 } |
298 | 299 |
299 explicit Persistent(T& raw) : m_raw(&raw) | 300 explicit Persistent(T& raw) : m_raw(&raw) |
300 { | 301 { |
301 ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); | 302 ASSERT_IS_VALID_PERSISTENT_POINTER(m_raw); |
| 303 recordBacktrace(); |
302 } | 304 } |
303 | 305 |
304 Persistent(const Persistent& other) : m_raw(other) { } | 306 Persistent(const Persistent& other) : m_raw(other) { recordBacktrace(); } |
305 | 307 |
306 template<typename U> | 308 template<typename U> |
307 Persistent(const Persistent<U, RootsAccessor>& other) : m_raw(other) { } | 309 Persistent(const Persistent<U, RootsAccessor>& other) : m_raw(other) { recor
dBacktrace(); } |
308 | 310 |
309 template<typename U> | 311 template<typename U> |
310 Persistent(const Member<U>& other) : m_raw(other) { } | 312 Persistent(const Member<U>& other) : m_raw(other) { recordBacktrace(); } |
311 | 313 |
312 template<typename U> | 314 template<typename U> |
313 Persistent(const RawPtr<U>& other) : m_raw(other.get()) { } | 315 Persistent(const RawPtr<U>& other) : m_raw(other.get()) { recordBacktrace();
} |
314 | 316 |
315 template<typename U> | 317 template<typename U> |
316 Persistent& operator=(U* other) | 318 Persistent& operator=(U* other) |
317 { | 319 { |
318 m_raw = other; | 320 m_raw = other; |
| 321 recordBacktrace(); |
319 return *this; | 322 return *this; |
320 } | 323 } |
321 | 324 |
322 Persistent& operator=(std::nullptr_t) | 325 Persistent& operator=(std::nullptr_t) |
323 { | 326 { |
324 m_raw = 0; | 327 m_raw = 0; |
325 return *this; | 328 return *this; |
326 } | 329 } |
327 | 330 |
328 void clear() { m_raw = 0; } | 331 void clear() { m_raw = 0; } |
329 | 332 |
330 virtual ~Persistent() | 333 virtual ~Persistent() |
331 { | 334 { |
332 m_raw = 0; | 335 m_raw = 0; |
333 } | 336 } |
334 | 337 |
335 template<typename U> | 338 template<typename U> |
336 U* as() const | 339 U* as() const |
337 { | 340 { |
338 return static_cast<U*>(m_raw); | 341 return static_cast<U*>(m_raw); |
339 } | 342 } |
340 | 343 |
341 void trace(Visitor* visitor) | 344 void trace(Visitor* visitor) |
342 { | 345 { |
343 COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, NonGarbageCollectedObjectInPersis
tent); | 346 COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, NonGarbageCollectedObjectInPersis
tent); |
344 #if ENABLE(GC_TRACING) | 347 #if ENABLE(GC_TRACING) |
345 visitor->setHostInfo(this, "Persistent"); | 348 visitor->setHostInfo(this, m_tracingName.isEmpty() ? "Persistent" : m_tr
acingName); |
346 #endif | 349 #endif |
347 visitor->mark(m_raw); | 350 visitor->mark(m_raw); |
348 } | 351 } |
349 | 352 |
350 T* release() | 353 T* release() |
351 { | 354 { |
352 T* result = m_raw; | 355 T* result = m_raw; |
353 m_raw = 0; | 356 m_raw = 0; |
354 return result; | 357 return result; |
355 } | 358 } |
356 | 359 |
357 T& operator*() const { return *m_raw; } | 360 T& operator*() const { return *m_raw; } |
358 | 361 |
359 bool operator!() const { return !m_raw; } | 362 bool operator!() const { return !m_raw; } |
360 | 363 |
361 operator T*() const { return m_raw; } | 364 operator T*() const { return m_raw; } |
362 operator RawPtr<T>() const { return m_raw; } | 365 operator RawPtr<T>() const { return m_raw; } |
363 | 366 |
364 T* operator->() const { return *this; } | 367 T* operator->() const { return *this; } |
365 | 368 |
366 Persistent& operator=(const Persistent& other) | 369 Persistent& operator=(const Persistent& other) |
367 { | 370 { |
368 m_raw = other; | 371 m_raw = other; |
| 372 recordBacktrace(); |
369 return *this; | 373 return *this; |
370 } | 374 } |
371 | 375 |
372 template<typename U> | 376 template<typename U> |
373 Persistent& operator=(const Persistent<U, RootsAccessor>& other) | 377 Persistent& operator=(const Persistent<U, RootsAccessor>& other) |
374 { | 378 { |
375 m_raw = other; | 379 m_raw = other; |
| 380 recordBacktrace(); |
376 return *this; | 381 return *this; |
377 } | 382 } |
378 | 383 |
379 template<typename U> | 384 template<typename U> |
380 Persistent& operator=(const Member<U>& other) | 385 Persistent& operator=(const Member<U>& other) |
381 { | 386 { |
382 m_raw = other; | 387 m_raw = other; |
| 388 recordBacktrace(); |
383 return *this; | 389 return *this; |
384 } | 390 } |
385 | 391 |
386 template<typename U> | 392 template<typename U> |
387 Persistent& operator=(const RawPtr<U>& other) | 393 Persistent& operator=(const RawPtr<U>& other) |
388 { | 394 { |
389 m_raw = other; | 395 m_raw = other; |
| 396 recordBacktrace(); |
390 return *this; | 397 return *this; |
391 } | 398 } |
392 | 399 |
393 T* get() const { return m_raw; } | 400 T* get() const { return m_raw; } |
394 | 401 |
395 private: | 402 private: |
| 403 #if ENABLE(GC_TRACING) |
| 404 void recordBacktrace() |
| 405 { |
| 406 if (m_raw) |
| 407 m_tracingName = Heap::createBacktraceString(); |
| 408 } |
| 409 |
| 410 String m_tracingName; |
| 411 #else |
| 412 inline void recordBacktrace() const { } |
| 413 #endif |
396 T* m_raw; | 414 T* m_raw; |
397 | 415 |
398 friend class CrossThreadPersistent<T>; | 416 friend class CrossThreadPersistent<T>; |
399 }; | 417 }; |
400 | 418 |
401 // Unlike Persistent, we can destruct a CrossThreadPersistent in a thread | 419 // Unlike Persistent, we can destruct a CrossThreadPersistent in a thread |
402 // different from the construction thread. | 420 // different from the construction thread. |
403 template<typename T> | 421 template<typename T> |
404 class CrossThreadPersistent : public Persistent<T, GlobalPersistents> { | 422 class CrossThreadPersistent : public Persistent<T, GlobalPersistents> { |
405 WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(CrossThreadPersistent); | 423 WTF_DISALLOW_CONSTRUCTION_FROM_ZERO(CrossThreadPersistent); |
(...skipping 12 matching lines...) Expand all Loading... |
418 // We overload the various new and delete operators with using the WTF Defau
ltAllocator to ensure persistent | 436 // We overload the various new and delete operators with using the WTF Defau
ltAllocator to ensure persistent |
419 // heap collections are always allocated off-heap. This allows persistent co
llections to be used in | 437 // heap collections are always allocated off-heap. This allows persistent co
llections to be used in |
420 // DEFINE_STATIC_LOCAL et. al. | 438 // DEFINE_STATIC_LOCAL et. al. |
421 WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); | 439 WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); |
422 public: | 440 public: |
423 PersistentHeapCollectionBase() { } | 441 PersistentHeapCollectionBase() { } |
424 | 442 |
425 template<typename OtherCollection> | 443 template<typename OtherCollection> |
426 PersistentHeapCollectionBase(const OtherCollection& other) : Collection(othe
r) { } | 444 PersistentHeapCollectionBase(const OtherCollection& other) : Collection(othe
r) { } |
427 | 445 |
428 void trace(Visitor* visitor) { visitor->trace(*static_cast<Collection*>(this
)); } | 446 void trace(Visitor* visitor) |
| 447 { |
| 448 #if ENABLE(GC_TRACING) |
| 449 visitor->setHostInfo(this, "PersistentHeapCollectionBase"); |
| 450 #endif |
| 451 visitor->trace(*static_cast<Collection*>(this)); |
| 452 } |
429 }; | 453 }; |
430 | 454 |
431 template< | 455 template< |
432 typename KeyArg, | 456 typename KeyArg, |
433 typename MappedArg, | 457 typename MappedArg, |
434 typename HashArg = typename DefaultHash<KeyArg>::Hash, | 458 typename HashArg = typename DefaultHash<KeyArg>::Hash, |
435 typename KeyTraitsArg = HashTraits<KeyArg>, | 459 typename KeyTraitsArg = HashTraits<KeyArg>, |
436 typename MappedTraitsArg = HashTraits<MappedArg> > | 460 typename MappedTraitsArg = HashTraits<MappedArg> > |
437 class PersistentHeapHashMap : public PersistentHeapCollectionBase<HeapHashMap<Ke
yArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> > { }; | 461 class PersistentHeapHashMap : public PersistentHeapCollectionBase<HeapHashMap<Ke
yArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> > { }; |
438 | 462 |
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WebCore::Is
GarbageCollectedType<T>::value> { | 1200 struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WebCore::Is
GarbageCollectedType<T>::value> { |
1177 }; | 1201 }; |
1178 | 1202 |
1179 template<typename T> | 1203 template<typename T> |
1180 struct ParamStorageTraits<RawPtr<T> > : public PointerParamStorageTraits<T*, Web
Core::IsGarbageCollectedType<T>::value> { | 1204 struct ParamStorageTraits<RawPtr<T> > : public PointerParamStorageTraits<T*, Web
Core::IsGarbageCollectedType<T>::value> { |
1181 }; | 1205 }; |
1182 | 1206 |
1183 } // namespace WTF | 1207 } // namespace WTF |
1184 | 1208 |
1185 #endif | 1209 #endif |
OLD | NEW |