OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 // | 353 // |
354 // Not meant for general consumption. | 354 // Not meant for general consumption. |
355 | 355 |
356 template <typename T, bool hasInlineCapacity, typename Allocator> | 356 template <typename T, bool hasInlineCapacity, typename Allocator> |
357 class VectorBufferBase { | 357 class VectorBufferBase { |
358 WTF_MAKE_NONCOPYABLE(VectorBufferBase); | 358 WTF_MAKE_NONCOPYABLE(VectorBufferBase); |
359 DISALLOW_NEW(); | 359 DISALLOW_NEW(); |
360 | 360 |
361 public: | 361 public: |
362 void allocateBuffer(size_t newCapacity) { | 362 void allocateBuffer(size_t newCapacity) { |
| 363 checkCreationThread(); |
363 DCHECK(newCapacity); | 364 DCHECK(newCapacity); |
364 DCHECK_LE(newCapacity, | 365 DCHECK_LE(newCapacity, |
365 Allocator::template maxElementCountInBackingStore<T>()); | 366 Allocator::template maxElementCountInBackingStore<T>()); |
366 size_t sizeToAllocate = allocationSize(newCapacity); | 367 size_t sizeToAllocate = allocationSize(newCapacity); |
367 if (hasInlineCapacity) | 368 if (hasInlineCapacity) |
368 m_buffer = | 369 m_buffer = |
369 Allocator::template allocateInlineVectorBacking<T>(sizeToAllocate); | 370 Allocator::template allocateInlineVectorBacking<T>(sizeToAllocate); |
370 else | 371 else |
371 m_buffer = Allocator::template allocateVectorBacking<T>(sizeToAllocate); | 372 m_buffer = Allocator::template allocateVectorBacking<T>(sizeToAllocate); |
372 m_capacity = sizeToAllocate / sizeof(T); | 373 m_capacity = sizeToAllocate / sizeof(T); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 OffsetRange() : begin(0), end(0) {} | 419 OffsetRange() : begin(0), end(0) {} |
419 explicit OffsetRange(size_t begin, size_t end) : begin(begin), end(end) { | 420 explicit OffsetRange(size_t begin, size_t end) : begin(begin), end(end) { |
420 DCHECK_LE(begin, end); | 421 DCHECK_LE(begin, end); |
421 } | 422 } |
422 bool empty() const { return begin == end; } | 423 bool empty() const { return begin == end; } |
423 size_t begin; | 424 size_t begin; |
424 size_t end; | 425 size_t end; |
425 }; | 426 }; |
426 | 427 |
427 protected: | 428 protected: |
428 VectorBufferBase() : m_buffer(nullptr), m_capacity(0) {} | 429 VectorBufferBase() : m_buffer(nullptr), m_capacity(0) { |
| 430 if (Allocator::isGarbageCollected) |
| 431 m_creationThread = currentThread(); |
| 432 } |
429 | 433 |
430 VectorBufferBase(T* buffer, size_t capacity) | 434 VectorBufferBase(T* buffer, size_t capacity) |
431 : m_buffer(buffer), m_capacity(capacity) {} | 435 : m_buffer(buffer), m_capacity(capacity) { |
| 436 if (Allocator::isGarbageCollected) |
| 437 m_creationThread = currentThread(); |
| 438 } |
| 439 |
| 440 #if DCHECK_IS_ON() |
| 441 void checkCreationThread() const { |
| 442 DCHECK(!Allocator::isGarbageCollected || |
| 443 m_creationThread == currentThread()); |
| 444 } |
| 445 #endif |
432 | 446 |
433 T* m_buffer; | 447 T* m_buffer; |
434 unsigned m_capacity; | 448 unsigned m_capacity; |
435 unsigned m_size; | 449 unsigned m_size; |
| 450 #if DCHECK_IS_ON() |
| 451 ThreadIdentifier m_creationThread; |
| 452 #endif |
436 }; | 453 }; |
437 | 454 |
438 template <typename T, | 455 template <typename T, |
439 size_t inlineCapacity, | 456 size_t inlineCapacity, |
440 typename Allocator = PartitionAllocator> | 457 typename Allocator = PartitionAllocator> |
441 class VectorBuffer; | 458 class VectorBuffer; |
442 | 459 |
443 template <typename T, typename Allocator> | 460 template <typename T, typename Allocator> |
444 class VectorBuffer<T, 0, Allocator> | 461 class VectorBuffer<T, 0, Allocator> |
445 : protected VectorBufferBase<T, false, Allocator> { | 462 : protected VectorBufferBase<T, false, Allocator> { |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1901 visitor, *const_cast<T*>(bufferEntry)); | 1918 visitor, *const_cast<T*>(bufferEntry)); |
1902 checkUnusedSlots(buffer() + size(), buffer() + capacity()); | 1919 checkUnusedSlots(buffer() + size(), buffer() + capacity()); |
1903 } | 1920 } |
1904 } | 1921 } |
1905 | 1922 |
1906 } // namespace WTF | 1923 } // namespace WTF |
1907 | 1924 |
1908 using WTF::Vector; | 1925 using WTF::Vector; |
1909 | 1926 |
1910 #endif // WTF_Vector_h | 1927 #endif // WTF_Vector_h |
OLD | NEW |