From a9061de9ff8d5b9545e5d1ef7a6e4054e1907c95 Mon Sep 17 00:00:00 2001 From: robertphillips Date: Fri, 27 Feb 2015 08:31:57 -0800 Subject: Add rewind capability to SkChunkAlloc Split off from https://codereview.chromium.org/940533003/ (Decrease GrInOrderDrawBuffer::Cmd's reliance on GrInOrderDrawBuffer) Review URL: https://codereview.chromium.org/967553003 --- tests/MemsetTest.cpp | 75 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 17 deletions(-) (limited to 'tests/MemsetTest.cpp') diff --git a/tests/MemsetTest.cpp b/tests/MemsetTest.cpp index ee6aaea94e..1e1378b4ad 100644 --- a/tests/MemsetTest.cpp +++ b/tests/MemsetTest.cpp @@ -9,32 +9,73 @@ #include "SkUtils.h" #include "Test.h" +static void check_alloc(skiatest::Reporter* reporter, const SkChunkAlloc& alloc, + size_t capacity, size_t used, int numBlocks) { + REPORTER_ASSERT(reporter, alloc.totalCapacity() >= capacity); + REPORTER_ASSERT(reporter, alloc.totalUsed() == used); + SkDEBUGCODE(REPORTER_ASSERT(reporter, alloc.blockCount() == numBlocks);) +} + +static void* simple_alloc(skiatest::Reporter* reporter, SkChunkAlloc* alloc, size_t size) { + void* ptr = alloc->allocThrow(size); + check_alloc(reporter, *alloc, size, size, 1); + REPORTER_ASSERT(reporter, alloc->contains(ptr)); + return ptr; +} + static void test_chunkalloc(skiatest::Reporter* reporter) { - size_t min = 256; - SkChunkAlloc alloc(min); + static const size_t kMin = 1024; + SkChunkAlloc alloc(kMin); - REPORTER_ASSERT(reporter, 0 == alloc.totalCapacity()); - REPORTER_ASSERT(reporter, 0 == alloc.totalUsed()); - REPORTER_ASSERT(reporter, 0 == alloc.blockCount()); + //------------------------------------------------------------------------ + // check empty + check_alloc(reporter, alloc, 0, 0, 0); REPORTER_ASSERT(reporter, !alloc.contains(NULL)); REPORTER_ASSERT(reporter, !alloc.contains(reporter)); + // reset on empty allocator alloc.reset(); - REPORTER_ASSERT(reporter, 0 == alloc.totalCapacity()); - REPORTER_ASSERT(reporter, 0 == alloc.totalUsed()); - REPORTER_ASSERT(reporter, 0 == alloc.blockCount()); - - size_t size = min >> 1; - void* ptr = alloc.allocThrow(size); - REPORTER_ASSERT(reporter, alloc.totalCapacity() >= size); - REPORTER_ASSERT(reporter, alloc.totalUsed() == size); - REPORTER_ASSERT(reporter, alloc.blockCount() > 0); - REPORTER_ASSERT(reporter, alloc.contains(ptr)); + check_alloc(reporter, alloc, 0, 0, 0); + + // rewind on empty allocator + alloc.rewind(); + check_alloc(reporter, alloc, 0, 0, 0); + + //------------------------------------------------------------------------ + // test reset when something is allocated + size_t size = kMin >> 1; + void* ptr = simple_alloc(reporter, &alloc, size); + + alloc.reset(); + check_alloc(reporter, alloc, 0, 0, 0); + REPORTER_ASSERT(reporter, !alloc.contains(ptr)); + + //------------------------------------------------------------------------ + // test rewind when something is allocated + ptr = simple_alloc(reporter, &alloc, size); + + alloc.rewind(); + check_alloc(reporter, alloc, size, 0, 1); + REPORTER_ASSERT(reporter, !alloc.contains(ptr)); + // use the available block + ptr = simple_alloc(reporter, &alloc, size); alloc.reset(); + + //------------------------------------------------------------------------ + // test out allocating a second block + ptr = simple_alloc(reporter, &alloc, size); + + ptr = alloc.allocThrow(kMin); + check_alloc(reporter, alloc, 2*kMin, size+kMin, 2); + REPORTER_ASSERT(reporter, alloc.contains(ptr)); + + //------------------------------------------------------------------------ + // test out unalloc + size_t freed = alloc.unalloc(ptr); + REPORTER_ASSERT(reporter, freed == kMin); + check_alloc(reporter, alloc, 2*kMin, size, 2); REPORTER_ASSERT(reporter, !alloc.contains(ptr)); - REPORTER_ASSERT(reporter, 0 == alloc.totalCapacity()); - REPORTER_ASSERT(reporter, 0 == alloc.totalUsed()); } /////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3