char* operator()(char* objEnd, ptrdiff_t size) { return objEnd + size; }
};
-struct SkArenaAlloc::NextBlock {
- char* operator()(char* objEnd, ptrdiff_t size) {
- ResetBlock(objEnd + size);
- delete [] objEnd;
- return nullptr;
- }
+struct NextBlock {
+ char* operator()(char* objEnd, ptrdiff_t size) { delete [] objEnd; return objEnd + size; }
};
SkArenaAlloc::SkArenaAlloc(char* block, size_t size, size_t extraSize)
- : fDtorCursor {block}
- , fCursor {block}
- , fEnd {block + size}
- , fFirstBlock {block}
- , fFirstSize {size}
- , fExtraSize {extraSize}
+ : fDtorCursor{block}
+ , fCursor {block}
+ , fEnd {block + size}
+ , fExtraSize {extraSize}
{
if (size < sizeof(Footer)) {
fEnd = fCursor = fDtorCursor = nullptr;
}
SkArenaAlloc::~SkArenaAlloc() {
- ResetBlock(fDtorCursor);
+ this->reset();
}
void SkArenaAlloc::reset() {
- this->~SkArenaAlloc();
- new (this) SkArenaAlloc{fFirstBlock, fFirstSize, fExtraSize};
+ Footer f;
+ memmove(&f, fDtorCursor - sizeof(Footer), sizeof(Footer));
+ char* releaser = fDtorCursor;
+ while (releaser != nullptr) {
+ releaser = this->callFooterAction(releaser);
+ }
}
void SkArenaAlloc::installFooter(FooterAction* releaser, ptrdiff_t padding) {
Footer footer = (Footer)(footerData);
memmove(fCursor, &footer, sizeof(Footer));
+ Footer check;
+ memmove(&check, fCursor, sizeof(Footer));
fCursor += sizeof(Footer);
fDtorCursor = fCursor;
}
char* SkArenaAlloc::allocObjectWithFooter(size_t sizeIncludingFooter, size_t alignment) {
size_t mask = alignment - 1;
-restart:
+ restart:
size_t skipOverhead = 0;
bool needsSkipFooter = fCursor != fDtorCursor;
if (needsSkipFooter) {
return objStart;
}
-void SkArenaAlloc::ResetBlock(char* footerEnd) {
- while (footerEnd != nullptr) {
- footerEnd = CallFooterAction(footerEnd);
- }
-}
-
-char* SkArenaAlloc::CallFooterAction(char* footerEnd) {
+char* SkArenaAlloc::callFooterAction(char* end) {
Footer footer;
- memcpy(&footer, footerEnd - sizeof(Footer), sizeof(Footer));
+ memcpy(&footer, end - sizeof(Footer), sizeof(Footer));
- FooterAction* action = (FooterAction*)((char*)EndChain + (footer >> 5));
+ FooterAction* releaser = (FooterAction*)((char*)EndChain + (footer >> 5));
ptrdiff_t padding = footer & 31;
- char* r = action(footerEnd) - padding;
+ char* r = releaser(end) - padding;
return r;
}
SkArenaAlloc(char* block, size_t size, size_t extraSize = 0);
template <size_t kSize>
- SkArenaAlloc(char (&block)[kSize], size_t extraSize = kSize)
+ SkArenaAlloc(char (&block)[kSize], size_t extraSize = 0)
: SkArenaAlloc(block, kSize, extraSize)
{}
using Footer = int32_t;
using FooterAction = char* (char*);
- struct NextBlock;
-
void installFooter(FooterAction* releaser, ptrdiff_t padding);
// N.B. Action is different than FooterAction. FooterAction expects the end of the Footer,
return objStart;
}
- static char* CallFooterAction(char* end);
-
- static void ResetBlock(char* footerEnd);
+ char* callFooterAction(char* end);
static char* EndChain(char*);
}
};
- char* fDtorCursor;
- char* fCursor;
- char* fEnd;
- char* const fFirstBlock;
- const size_t fFirstSize;
- const size_t fExtraSize;
+ char* fDtorCursor;
+ char* fCursor;
+ char* fEnd;
+ size_t fExtraSize;
};
#endif//SkFixedAlloc_DEFINED
uint32_t array[128];
};
- struct Node {
- Node(Node* n) : next(n) { created++; }
- ~Node() {
- destroyed++;
- if (next) {
- next->~Node();
- }
- }
- Node *next;
- };
-
- struct Start {
- ~Start() {
- if (start) {
- start->~Node();
- }
- }
- Node* start;
- };
-
}
struct WithDtor {
{
created = 0;
destroyed = 0;
- char block[64];
+ char block[1024];
SkArenaAlloc arena{block};
REPORTER_ASSERT(r, *arena.make<int>(3) == 3);
}
REPORTER_ASSERT(r, created == 11);
REPORTER_ASSERT(r, destroyed == 11);
-
- {
- char storage[64];
- SkArenaAlloc arena{storage};
- arena.makeArrayDefault<char>(256);
- arena.reset();
- arena.reset();
- }
-
- {
- created = 0;
- destroyed = 0;
- char storage[64];
- SkArenaAlloc arena{storage};
-
- Start start;
- Node* current = nullptr;
- for (int i = 0; i < 128; i++) {
- uint64_t* temp = arena.makeArrayDefault<uint64_t>(sizeof(Node) / sizeof(Node*));
- current = new (temp)Node(current);
- }
- start.start = current;
- }
-
- REPORTER_ASSERT(r, created == 128);
- REPORTER_ASSERT(r, destroyed == 128);
}