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

Side by Side Diff: Source/wtf/Vector.h

Issue 23451016: Reorder the destruction sequence of Vector() to do less work. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 3 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
« no previous file with comments | « Source/wtf/Deque.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 void reallocateBuffer(size_t newCapacity) 272 void reallocateBuffer(size_t newCapacity)
273 { 273 {
274 ASSERT(shouldReallocateBuffer(newCapacity)); 274 ASSERT(shouldReallocateBuffer(newCapacity));
275 // Using "unsigned" is not a limitation because Chromium's max mallo c() is 2GB even on 64-bit. 275 // Using "unsigned" is not a limitation because Chromium's max mallo c() is 2GB even on 64-bit.
276 RELEASE_ASSERT(newCapacity <= std::numeric_limits<unsigned>::max() / sizeof(T)); 276 RELEASE_ASSERT(newCapacity <= std::numeric_limits<unsigned>::max() / sizeof(T));
277 size_t sizeToAllocate = fastMallocGoodSize(newCapacity * sizeof(T)); 277 size_t sizeToAllocate = fastMallocGoodSize(newCapacity * sizeof(T));
278 m_capacity = sizeToAllocate / sizeof(T); 278 m_capacity = sizeToAllocate / sizeof(T);
279 m_buffer = static_cast<T*>(fastRealloc(m_buffer, sizeToAllocate)); 279 m_buffer = static_cast<T*>(fastRealloc(m_buffer, sizeToAllocate));
280 } 280 }
281 281
282 void deallocateBuffer(T* bufferToDeallocate)
283 {
284 if (!bufferToDeallocate)
285 return;
286
287 if (m_buffer == bufferToDeallocate) {
288 m_buffer = 0;
289 m_capacity = 0;
290 }
291
292 fastFree(bufferToDeallocate);
293 }
294
295 T* buffer() { return m_buffer; } 282 T* buffer() { return m_buffer; }
296 const T* buffer() const { return m_buffer; } 283 const T* buffer() const { return m_buffer; }
297 size_t capacity() const { return m_capacity; } 284 size_t capacity() const { return m_capacity; }
298 285
299 protected: 286 protected:
300 VectorBufferBase() 287 VectorBufferBase()
301 : m_buffer(0) 288 : m_buffer(0)
302 , m_capacity(0) 289 , m_capacity(0)
303 { 290 {
304 } 291 }
(...skipping 30 matching lines...) Expand all
335 { 322 {
336 // Calling malloc(0) might take a lock and may actually do an 323 // Calling malloc(0) might take a lock and may actually do an
337 // allocation on some systems. 324 // allocation on some systems.
338 if (capacity) 325 if (capacity)
339 allocateBuffer(capacity); 326 allocateBuffer(capacity);
340 } 327 }
341 328
342 ~VectorBuffer() 329 ~VectorBuffer()
343 { 330 {
344 deallocateBuffer(buffer()); 331 deallocateBuffer(buffer());
332 m_buffer = 0;
333 }
334
335 void deallocateBuffer(T* bufferToDeallocate)
336 {
337 if (LIKELY(!bufferToDeallocate))
338 return;
339
340 fastFree(bufferToDeallocate);
341 }
342
343 void clearBufferPointer()
344 {
345 m_buffer = 0;
346 m_capacity = 0;
345 } 347 }
346 348
347 void swap(VectorBuffer<T, 0>& other) 349 void swap(VectorBuffer<T, 0>& other)
348 { 350 {
349 std::swap(m_buffer, other.m_buffer); 351 std::swap(m_buffer, other.m_buffer);
350 std::swap(m_capacity, other.m_capacity); 352 std::swap(m_capacity, other.m_capacity);
351 } 353 }
352 354
353 void restoreInlineBufferIfNeeded() { } 355 void restoreInlineBufferIfNeeded() { }
354 356
355 using Base::allocateBuffer; 357 using Base::allocateBuffer;
356 using Base::shouldReallocateBuffer; 358 using Base::shouldReallocateBuffer;
357 using Base::reallocateBuffer; 359 using Base::reallocateBuffer;
358 using Base::deallocateBuffer;
359 360
360 using Base::buffer; 361 using Base::buffer;
361 using Base::capacity; 362 using Base::capacity;
362 363
363 protected: 364 protected:
364 using Base::m_size; 365 using Base::m_size;
365 366
366 private: 367 private:
367 using Base::m_buffer; 368 using Base::m_buffer;
368 using Base::m_capacity; 369 using Base::m_capacity;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 else { 401 else {
401 m_buffer = inlineBuffer(); 402 m_buffer = inlineBuffer();
402 m_capacity = inlineCapacity; 403 m_capacity = inlineCapacity;
403 } 404 }
404 } 405 }
405 406
406 void deallocateBuffer(T* bufferToDeallocate) 407 void deallocateBuffer(T* bufferToDeallocate)
407 { 408 {
408 if (LIKELY(bufferToDeallocate == inlineBuffer())) 409 if (LIKELY(bufferToDeallocate == inlineBuffer()))
409 return; 410 return;
410 Base::deallocateBuffer(bufferToDeallocate); 411
412 fastFree(bufferToDeallocate);
413 }
414
415 void clearBufferPointer()
416 {
417 m_buffer = 0;
418 m_capacity = 0;
411 } 419 }
412 420
413 bool shouldReallocateBuffer(size_t newCapacity) const 421 bool shouldReallocateBuffer(size_t newCapacity) const
414 { 422 {
415 // We cannot reallocate the inline buffer. 423 // We cannot reallocate the inline buffer.
416 return Base::shouldReallocateBuffer(newCapacity) && std::min(static_ cast<size_t>(m_capacity), newCapacity) > inlineCapacity; 424 return Base::shouldReallocateBuffer(newCapacity) && std::min(static_ cast<size_t>(m_capacity), newCapacity) > inlineCapacity;
417 } 425 }
418 426
419 void reallocateBuffer(size_t newCapacity) 427 void reallocateBuffer(size_t newCapacity)
420 { 428 {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 498
491 explicit Vector(size_t size) 499 explicit Vector(size_t size)
492 : Base(size) 500 : Base(size)
493 { 501 {
494 m_size = size; 502 m_size = size;
495 TypeOperations::initialize(begin(), end()); 503 TypeOperations::initialize(begin(), end());
496 } 504 }
497 505
498 ~Vector() 506 ~Vector()
499 { 507 {
500 if (m_size) 508 if (UNLIKELY(m_size))
501 shrink(0); 509 shrink(0);
502 } 510 }
503 511
504 Vector(const Vector&); 512 Vector(const Vector&);
505 template<size_t otherCapacity> 513 template<size_t otherCapacity>
506 Vector(const Vector<T, otherCapacity>&); 514 Vector(const Vector<T, otherCapacity>&);
507 515
508 Vector& operator=(const Vector&); 516 Vector& operator=(const Vector&);
509 template<size_t otherCapacity> 517 template<size_t otherCapacity>
510 Vector& operator=(const Vector<T, otherCapacity>&); 518 Vector& operator=(const Vector<T, otherCapacity>&);
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 if (newCapacity > 0) { 875 if (newCapacity > 0) {
868 if (Base::shouldReallocateBuffer(newCapacity)) { 876 if (Base::shouldReallocateBuffer(newCapacity)) {
869 Base::reallocateBuffer(newCapacity); 877 Base::reallocateBuffer(newCapacity);
870 return; 878 return;
871 } 879 }
872 880
873 T* oldEnd = end(); 881 T* oldEnd = end();
874 Base::allocateBuffer(newCapacity); 882 Base::allocateBuffer(newCapacity);
875 if (begin() != oldBuffer) 883 if (begin() != oldBuffer)
876 TypeOperations::move(oldBuffer, oldEnd, begin()); 884 TypeOperations::move(oldBuffer, oldEnd, begin());
885 } else {
886 Base::clearBufferPointer();
877 } 887 }
878 888
879 Base::deallocateBuffer(oldBuffer); 889 Base::deallocateBuffer(oldBuffer);
880 Base::restoreInlineBufferIfNeeded(); 890 Base::restoreInlineBufferIfNeeded();
881 } 891 }
882 892
883 // Templatizing these is better than just letting the conversion happen impl icitly, 893 // Templatizing these is better than just letting the conversion happen impl icitly,
884 // because for instance it allows a PassRefPtr to be appended to a RefPtr ve ctor 894 // because for instance it allows a PassRefPtr to be appended to a RefPtr ve ctor
885 // without refcount thrash. 895 // without refcount thrash.
886 896
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 inline bool operator!=(const Vector<T, inlineCapacity>& a, const Vector<T, i nlineCapacity>& b) 1074 inline bool operator!=(const Vector<T, inlineCapacity>& a, const Vector<T, i nlineCapacity>& b)
1065 { 1075 {
1066 return !(a == b); 1076 return !(a == b);
1067 } 1077 }
1068 1078
1069 } // namespace WTF 1079 } // namespace WTF
1070 1080
1071 using WTF::Vector; 1081 using WTF::Vector;
1072 1082
1073 #endif // WTF_Vector_h 1083 #endif // WTF_Vector_h
OLDNEW
« no previous file with comments | « Source/wtf/Deque.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698