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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
281 Persistent(std::nullptr_t) : Parent(nullptr) { } | 281 Persistent(std::nullptr_t) : Parent(nullptr) { } |
282 Persistent(T* raw) : Parent(raw) { } | 282 Persistent(T* raw) : Parent(raw) { } |
283 Persistent(T& raw) : Parent(raw) { } | 283 Persistent(T& raw) : Parent(raw) { } |
284 Persistent(const Persistent& other) : Parent(other) { } | 284 Persistent(const Persistent& other) : Parent(other) { } |
285 template<typename U> | 285 template<typename U> |
286 Persistent(const Persistent<U>& other) : Parent(other) { } | 286 Persistent(const Persistent<U>& other) : Parent(other) { } |
287 template<typename U> | 287 template<typename U> |
288 Persistent(const Member<U>& other) : Parent(other) { } | 288 Persistent(const Member<U>& other) : Parent(other) { } |
289 template<typename U> | 289 template<typename U> |
290 Persistent(const RawPtr<U>& other) : Parent(other.get()) { } | 290 Persistent(const RawPtr<U>& other) : Parent(other.get()) { } |
291 | |
292 template<typename U> | |
293 Persistent& operator=(U* other) | |
294 { | |
295 Parent::operator=(other); | |
296 return *this; | |
297 } | |
298 | |
299 template<typename U> | |
sof
2015/09/12 17:26:17
Cut&paste error - this one shouldn't be parameteri
| |
300 Persistent& operator=(std::nullptr_t) | |
301 { | |
302 Parent::operator=(nullptr); | |
303 return *this; | |
304 } | |
305 | |
306 Persistent& operator=(const Persistent& other) | |
307 { | |
308 Parent::operator=(other); | |
309 return *this; | |
310 } | |
311 | |
312 template<typename U> | |
313 Persistent& operator=(const Persistent<U>& other) | |
314 { | |
315 Parent::operator=(other); | |
316 return *this; | |
317 } | |
318 | |
319 template<typename U> | |
320 Persistent& operator=(const Member<U>& other) | |
321 { | |
322 Parent::operator=(other); | |
323 return *this; | |
324 } | |
325 | |
326 template<typename U> | |
327 Persistent& operator=(const RawPtr<U>& other) | |
328 { | |
329 Parent::operator=(other); | |
330 return *this; | |
331 } | |
291 }; | 332 }; |
292 | 333 |
293 // WeakPersistent is a way to create a weak pointer from an off-heap object | 334 // WeakPersistent is a way to create a weak pointer from an off-heap object |
294 // to an on-heap object. The m_raw is automatically cleared when the pointee | 335 // to an on-heap object. The m_raw is automatically cleared when the pointee |
295 // gets collected. | 336 // gets collected. |
296 // | 337 // |
297 // We have to construct and destruct WeakPersistent in the same thread. | 338 // We have to construct and destruct WeakPersistent in the same thread. |
298 // | 339 // |
299 // Note that collections of WeakPersistents are not supported. Use a persistent | 340 // Note that collections of WeakPersistents are not supported. Use a persistent |
300 // collection of WeakMembers instead. | 341 // collection of WeakMembers instead. |
301 // | 342 // |
302 // HashSet<WeakPersistent<T>> m_set; // wrong | 343 // HashSet<WeakPersistent<T>> m_set; // wrong |
303 // PersistentHeapHashSet<WeakMember<T>> m_set; // correct | 344 // PersistentHeapHashSet<WeakMember<T>> m_set; // correct |
304 template<typename T> | 345 template<typename T> |
305 class WeakPersistent : public PersistentBase<T, WeakPersistentConfiguration, Sin gleThreadPersistentConfiguration> { | 346 class WeakPersistent : public PersistentBase<T, WeakPersistentConfiguration, Sin gleThreadPersistentConfiguration> { |
306 typedef PersistentBase<T, WeakPersistentConfiguration, SingleThreadPersisten tConfiguration> Parent; | 347 typedef PersistentBase<T, WeakPersistentConfiguration, SingleThreadPersisten tConfiguration> Parent; |
307 public: | 348 public: |
308 WeakPersistent() : Parent() { } | 349 WeakPersistent() : Parent() { } |
309 WeakPersistent(std::nullptr_t) : Parent(nullptr) { } | 350 WeakPersistent(std::nullptr_t) : Parent(nullptr) { } |
310 WeakPersistent(T* raw) : Parent(raw) { } | 351 WeakPersistent(T* raw) : Parent(raw) { } |
311 WeakPersistent(T& raw) : Parent(raw) { } | 352 WeakPersistent(T& raw) : Parent(raw) { } |
312 WeakPersistent(const WeakPersistent& other) : Parent(other) { } | 353 WeakPersistent(const WeakPersistent& other) : Parent(other) { } |
313 template<typename U> | 354 template<typename U> |
314 WeakPersistent(const WeakPersistent<U>& other) : Parent(other) { } | 355 WeakPersistent(const WeakPersistent<U>& other) : Parent(other) { } |
315 template<typename U> | 356 template<typename U> |
316 WeakPersistent(const Member<U>& other) : Parent(other) { } | 357 WeakPersistent(const Member<U>& other) : Parent(other) { } |
317 template<typename U> | 358 template<typename U> |
318 WeakPersistent(const RawPtr<U>& other) : Parent(other.get()) { } | 359 WeakPersistent(const RawPtr<U>& other) : Parent(other.get()) { } |
360 | |
361 template<typename U> | |
362 WeakPersistent& operator=(U* other) | |
363 { | |
364 Parent::operator=(other); | |
365 return *this; | |
366 } | |
367 | |
368 template<typename U> | |
369 WeakPersistent& operator=(std::nullptr_t) | |
370 { | |
371 Parent::operator=(nullptr); | |
372 return *this; | |
373 } | |
374 | |
375 WeakPersistent& operator=(const WeakPersistent& other) | |
376 { | |
377 Parent::operator=(other); | |
378 return *this; | |
379 } | |
380 | |
381 template<typename U> | |
382 WeakPersistent& operator=(const WeakPersistent<U>& other) | |
383 { | |
384 Parent::operator=(other); | |
385 return *this; | |
386 } | |
387 | |
388 template<typename U> | |
389 WeakPersistent& operator=(const Member<U>& other) | |
390 { | |
391 Parent::operator=(other); | |
392 return *this; | |
393 } | |
394 | |
395 template<typename U> | |
396 WeakPersistent& operator=(const RawPtr<U>& other) | |
397 { | |
398 Parent::operator=(other); | |
399 return *this; | |
400 } | |
319 }; | 401 }; |
320 | 402 |
321 // Unlike Persistent, we can destruct a CrossThreadPersistent in a thread | 403 // Unlike Persistent, we can destruct a CrossThreadPersistent in a thread |
322 // different from the construction thread. | 404 // different from the construction thread. |
323 template<typename T> | 405 template<typename T> |
324 class CrossThreadPersistent : public PersistentBase<T, NonWeakPersistentConfigur ation, CrossThreadPersistentConfiguration> { | 406 class CrossThreadPersistent : public PersistentBase<T, NonWeakPersistentConfigur ation, CrossThreadPersistentConfiguration> { |
325 typedef PersistentBase<T, NonWeakPersistentConfiguration, CrossThreadPersist entConfiguration> Parent; | 407 typedef PersistentBase<T, NonWeakPersistentConfiguration, CrossThreadPersist entConfiguration> Parent; |
326 public: | 408 public: |
327 CrossThreadPersistent() : Parent() { } | 409 CrossThreadPersistent() : Parent() { } |
328 CrossThreadPersistent(std::nullptr_t) : Parent(nullptr) { } | 410 CrossThreadPersistent(std::nullptr_t) : Parent(nullptr) { } |
329 CrossThreadPersistent(T* raw) : Parent(raw) { } | 411 CrossThreadPersistent(T* raw) : Parent(raw) { } |
330 CrossThreadPersistent(T& raw) : Parent(raw) { } | 412 CrossThreadPersistent(T& raw) : Parent(raw) { } |
331 CrossThreadPersistent(const CrossThreadPersistent& other) : Parent(other) { } | 413 CrossThreadPersistent(const CrossThreadPersistent& other) : Parent(other) { } |
332 template<typename U> | 414 template<typename U> |
333 CrossThreadPersistent(const CrossThreadPersistent<U>& other) : Parent(other) { } | 415 CrossThreadPersistent(const CrossThreadPersistent<U>& other) : Parent(other) { } |
334 template<typename U> | 416 template<typename U> |
335 CrossThreadPersistent(const Member<U>& other) : Parent(other) { } | 417 CrossThreadPersistent(const Member<U>& other) : Parent(other) { } |
336 template<typename U> | 418 template<typename U> |
337 CrossThreadPersistent(const RawPtr<U>& other) : Parent(other.get()) { } | 419 CrossThreadPersistent(const RawPtr<U>& other) : Parent(other.get()) { } |
420 | |
421 template<typename U> | |
422 CrossThreadPersistent& operator=(U* other) | |
423 { | |
424 Parent::operator=(other); | |
425 return *this; | |
426 } | |
427 | |
428 template<typename U> | |
429 CrossThreadPersistent& operator=(std::nullptr_t) | |
430 { | |
431 Parent::operator=(nullptr); | |
432 return *this; | |
433 } | |
434 | |
435 CrossThreadPersistent& operator=(const CrossThreadPersistent& other) | |
436 { | |
437 Parent::operator=(other); | |
438 return *this; | |
439 } | |
440 | |
441 template<typename U> | |
442 CrossThreadPersistent& operator=(const CrossThreadPersistent<U>& other) | |
443 { | |
444 Parent::operator=(other); | |
445 return *this; | |
446 } | |
447 | |
448 template<typename U> | |
449 CrossThreadPersistent& operator=(const Member<U>& other) | |
450 { | |
451 Parent::operator=(other); | |
452 return *this; | |
453 } | |
454 | |
455 template<typename U> | |
456 CrossThreadPersistent& operator=(const RawPtr<U>& other) | |
457 { | |
458 Parent::operator=(other); | |
459 return *this; | |
460 } | |
338 }; | 461 }; |
339 | 462 |
340 // Combines the behavior of CrossThreadPersistent and WeakPersistent. | 463 // Combines the behavior of CrossThreadPersistent and WeakPersistent. |
341 template<typename T> | 464 template<typename T> |
342 class CrossThreadWeakPersistent : public PersistentBase<T, WeakPersistentConfigu ration, CrossThreadPersistentConfiguration> { | 465 class CrossThreadWeakPersistent : public PersistentBase<T, WeakPersistentConfigu ration, CrossThreadPersistentConfiguration> { |
343 typedef PersistentBase<T, WeakPersistentConfiguration, CrossThreadPersistent Configuration> Parent; | 466 typedef PersistentBase<T, WeakPersistentConfiguration, CrossThreadPersistent Configuration> Parent; |
344 public: | 467 public: |
345 CrossThreadWeakPersistent() : Parent() { } | 468 CrossThreadWeakPersistent() : Parent() { } |
346 CrossThreadWeakPersistent(std::nullptr_t) : Parent(nullptr) { } | 469 CrossThreadWeakPersistent(std::nullptr_t) : Parent(nullptr) { } |
347 CrossThreadWeakPersistent(T* raw) : Parent(raw) { } | 470 CrossThreadWeakPersistent(T* raw) : Parent(raw) { } |
348 CrossThreadWeakPersistent(T& raw) : Parent(raw) { } | 471 CrossThreadWeakPersistent(T& raw) : Parent(raw) { } |
349 CrossThreadWeakPersistent(const CrossThreadWeakPersistent& other) : Parent(o ther) { } | 472 CrossThreadWeakPersistent(const CrossThreadWeakPersistent& other) : Parent(o ther) { } |
350 template<typename U> | 473 template<typename U> |
351 CrossThreadWeakPersistent(const CrossThreadWeakPersistent<U>& other) : Paren t(other) { } | 474 CrossThreadWeakPersistent(const CrossThreadWeakPersistent<U>& other) : Paren t(other) { } |
352 template<typename U> | 475 template<typename U> |
353 CrossThreadWeakPersistent(const Member<U>& other) : Parent(other) { } | 476 CrossThreadWeakPersistent(const Member<U>& other) : Parent(other) { } |
354 template<typename U> | 477 template<typename U> |
355 CrossThreadWeakPersistent(const RawPtr<U>& other) : Parent(other.get()) { } | 478 CrossThreadWeakPersistent(const RawPtr<U>& other) : Parent(other.get()) { } |
479 | |
480 template<typename U> | |
481 CrossThreadWeakPersistent& operator=(U* other) | |
482 { | |
483 Parent::operator=(other); | |
484 return *this; | |
485 } | |
486 | |
487 template<typename U> | |
488 CrossThreadWeakPersistent& operator=(std::nullptr_t) | |
489 { | |
490 Parent::operator=(nullptr); | |
491 return *this; | |
492 } | |
493 | |
494 CrossThreadWeakPersistent& operator=(const CrossThreadWeakPersistent& other) | |
495 { | |
496 Parent::operator=(other); | |
497 return *this; | |
498 } | |
499 | |
500 template<typename U> | |
501 CrossThreadWeakPersistent& operator=(const CrossThreadWeakPersistent<U>& oth er) | |
502 { | |
503 Parent::operator=(other); | |
504 return *this; | |
505 } | |
506 | |
507 template<typename U> | |
508 CrossThreadWeakPersistent& operator=(const Member<U>& other) | |
509 { | |
510 Parent::operator=(other); | |
511 return *this; | |
512 } | |
513 | |
514 template<typename U> | |
515 CrossThreadWeakPersistent& operator=(const RawPtr<U>& other) | |
516 { | |
517 Parent::operator=(other); | |
518 return *this; | |
519 } | |
356 }; | 520 }; |
357 | 521 |
358 template<typename Collection> | 522 template<typename Collection> |
359 class PersistentHeapCollectionBase : public Collection { | 523 class PersistentHeapCollectionBase : public Collection { |
360 // We overload the various new and delete operators with using the WTF Defau ltAllocator to ensure persistent | 524 // We overload the various new and delete operators with using the WTF Defau ltAllocator to ensure persistent |
361 // heap collections are always allocated off-heap. This allows persistent co llections to be used in | 525 // heap collections are always allocated off-heap. This allows persistent co llections to be used in |
362 // DEFINE_STATIC_LOCAL et. al. | 526 // DEFINE_STATIC_LOCAL et. al. |
363 WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); | 527 WTF_USE_ALLOCATOR(PersistentHeapCollectionBase, WTF::DefaultAllocator); |
364 public: | 528 public: |
365 PersistentHeapCollectionBase() | 529 PersistentHeapCollectionBase() |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1209 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C rossThread)WeakPersistent. | 1373 // TODO(sof): extend WTF::FunctionWrapper call overloading to also handle (C rossThread)WeakPersistent. |
1210 static T* unwrap(const StorageType& value) { return value.get(); } | 1374 static T* unwrap(const StorageType& value) { return value.get(); } |
1211 }; | 1375 }; |
1212 | 1376 |
1213 template<typename T> | 1377 template<typename T> |
1214 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 1378 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; |
1215 | 1379 |
1216 } // namespace WTF | 1380 } // namespace WTF |
1217 | 1381 |
1218 #endif | 1382 #endif |
OLD | NEW |