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

Unified Diff: src/core/SkTLList.h

Issue 1458703005: Make SkTLList prealloc its first block of nodes (Closed) Base URL: https://skia.googlesource.com/skia.git@nblock
Patch Set: rebase Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkTLList.h
diff --git a/src/core/SkTLList.h b/src/core/SkTLList.h
index 1a8c54cb7c208ebfe099247338d18de12e356a9f..48e81bdac1803fb18082101e77d7e58654447048 100644
--- a/src/core/SkTLList.h
+++ b/src/core/SkTLList.h
@@ -39,6 +39,11 @@ public:
class Iter;
SkTLList() : fCount(0) {
+ fFirstBlock.fNodesInUse = 0;
+ for (unsigned int i = 0; i < N; ++i) {
+ fFreeList.addToHead(fFirstBlock.fNodes + i);
+ fFirstBlock.fNodes[i].fBlock = &fFirstBlock;
+ }
this->validate();
}
@@ -54,7 +59,9 @@ public:
for (unsigned int i = 0; i < N; ++i) {
block->fNodes[i].~Node();
}
- sk_free(block);
+ if (block != &fFirstBlock) {
+ sk_free(block);
+ }
}
}
}
@@ -222,6 +229,9 @@ private:
fFreeList.remove(node);
++node->fBlock->fNodesInUse;
} else {
+ // Should not get here when count == 0 because we always have the preallocated first
+ // block.
+ SkASSERT(fCount > 0);
Block* block = reinterpret_cast<Block*>(sk_malloc_throw(sizeof(Block)));
node = &block->fNodes[0];
new (node) Node;
@@ -241,8 +251,9 @@ private:
SkASSERT(node);
fList.remove(node);
SkTCast<T*>(node->fObj)->~T();
- if (0 == --node->fBlock->fNodesInUse) {
- Block* block = node->fBlock;
+ Block* block = node->fBlock;
+ // Don't ever elease the first block, just add its nodes to the free list
+ if (0 == --block->fNodesInUse && block != &fFirstBlock) {
for (unsigned int i = 0; i < N; ++i) {
if (block->fNodes + i != node) {
fFreeList.remove(block->fNodes + i);
@@ -260,8 +271,10 @@ private:
void validate() const {
#ifdef SK_DEBUG
SkASSERT((0 == fCount) == fList.isEmpty());
- SkASSERT((0 != fCount) || fFreeList.isEmpty());
-
+ if (0 == fCount) {
+ // Should only have the nodes from the first block in the free list.
+ SkASSERT(fFreeList.countEntries() == N);
+ }
fList.validate();
fFreeList.validate();
typename NodeList::Iter iter;
@@ -269,8 +282,9 @@ private:
while (freeNode) {
SkASSERT(fFreeList.isInList(freeNode));
Block* block = freeNode->fBlock;
- SkASSERT(block->fNodesInUse > 0 && (unsigned)block->fNodesInUse < N);
-
+ // Only the first block is allowed to have all its nodes in the free list.
+ SkASSERT(block->fNodesInUse > 0 || block == &fFirstBlock);
+ SkASSERT((unsigned)block->fNodesInUse < N);
int activeCnt = 0;
int freeCnt = 0;
for (unsigned int i = 0; i < N; ++i) {
@@ -310,6 +324,7 @@ private:
NodeList fList;
NodeList fFreeList;
+ Block fFirstBlock;
int fCount;
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698