GrMemoryPoolTest.cpp revision cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2
14da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com/*
24da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * Copyright 2011 Google Inc.
34da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com *
44da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
54da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * found in the LICENSE file.
64da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com */
74da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
8cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com// This is a GPU-backend specific test
9cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU
10cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "Test.h"
124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "GrMemoryPool.h"
134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkRandom.h"
144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkTDArray.h"
154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkTScopedPtr.h"
164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkInstCnt.h"
174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comnamespace {
194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// A is the top of an inheritance tree of classes that overload op new and
204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// and delete to use a GrMemoryPool. The objects have values of different types
214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// that can be set and checked.
224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass A {
234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic:
244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    A() {};
254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual void setValues(int v) {
264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fChar = static_cast<char>(v);
274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual bool checkValues(int v) {
294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        return fChar == static_cast<char>(v);
304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual ~A() {};
324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    void* operator new(size_t size) {
344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        if (!gPool.get()) {
354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return ::operator new(size);
364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        } else {
374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return gPool->allocate(size);
384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        }
394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    void operator delete(void* p) {
424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        if (!gPool.get()) {
434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            ::operator delete(p);
444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        } else {
454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return gPool->release(p);
464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        }
474da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
484da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
494da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    SK_DECLARE_INST_COUNT_ROOT(A);
504da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
514da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static A* Create(SkRandom* r);
524da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
534da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static void SetAllocator(size_t preallocSize, size_t minAllocSize) {
54b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#ifdef SK_ENABLE_INST_COUNT
554da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        SkASSERT(0 == GetInstanceCount());
56b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#endif
574da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        GrMemoryPool* pool = new GrMemoryPool(preallocSize, minAllocSize);
584da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        gPool.reset(pool);
594da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
604da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
614da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static void ResetAllocator() {
62b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#ifdef SK_ENABLE_INST_COUNT
634da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        SkASSERT(0 == GetInstanceCount());
64b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#endif
654da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        gPool.reset(NULL);
664da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
674da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
684da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate:
694da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static SkTScopedPtr<GrMemoryPool> gPool;
704da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    char fChar;
714da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
724da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comSK_DEFINE_INST_COUNT(A);
734da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comSkTScopedPtr<GrMemoryPool> A::gPool;
744da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
754da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass B : public A {
764da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic:
774da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    B() {};
784da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual void setValues(int v) {
794da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fDouble = static_cast<double>(v);
804da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        this->INHERITED::setValues(v);
814da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
824da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual bool checkValues(int v) {
834da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        return fDouble == static_cast<double>(v) &&
844da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com               this->INHERITED::checkValues(v);
854da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
864da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual ~B() {};
874da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
884da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate:
894da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    double fDouble;
904da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
914da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    typedef A INHERITED;
924da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
934da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
944da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass C : public A {
954da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic:
964da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    C() {};
974da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual void setValues(int v) {
984da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fInt64 = static_cast<int64_t>(v);
994da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        this->INHERITED::setValues(v);
1004da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1014da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual bool checkValues(int v) {
1024da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        return fInt64 == static_cast<int64_t>(v) &&
1034da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com               this->INHERITED::checkValues(v);
1044da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1054da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual ~C() {};
1064da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1074da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate:
1084da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    int64_t fInt64;
1094da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1104da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    typedef A INHERITED;
1114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
1124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// D derives from C and owns a dynamically created B
1144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass D : public C {
1154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic:
1164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    D() {
1174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fB = new B();
1184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual void setValues(int v) {
1204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fVoidStar = reinterpret_cast<void*>(v);
1214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        this->INHERITED::setValues(v);
1224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        fB->setValues(v);
1234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual bool checkValues(int v) {
1254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        return fVoidStar == reinterpret_cast<void*>(v) &&
1264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com               fB->checkValues(v) &&
1274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com               this->INHERITED::checkValues(v);
1284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual ~D() {
1304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        delete fB;
1314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate:
1334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    void*   fVoidStar;
1344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    B*      fB;
1354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    typedef C INHERITED;
1374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
1384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass E : public A {
1404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic:
1414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    E() {}
1424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual void setValues(int v) {
1434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(fIntArray); ++i) {
1444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            fIntArray[i] = v;
1454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        }
1464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        this->INHERITED::setValues(v);
1474da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1484da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual bool checkValues(int v) {
1494da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        bool ok = true;
1504da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        for (size_t i = 0; ok && i < SK_ARRAY_COUNT(fIntArray); ++i) {
1514da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            if (fIntArray[i] != v) {
1524da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                ok = false;
1534da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            }
1544da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        }
1554da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        return ok && this->INHERITED::checkValues(v);
1564da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1574da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    virtual ~E() {}
1584da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate:
1594da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    int   fIntArray[20];
1604da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1614da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    typedef A INHERITED;
1624da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
1634da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1644da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comA* A::Create(SkRandom* r) {
1654da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    switch (r->nextRangeU(0, 4)) {
1664da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        case 0:
1674da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return new A;
1684da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        case 1:
1694da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return new B;
1704da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        case 2:
1714da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return new C;
1724da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        case 3:
1734da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return new D;
1744da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        case 4:
1754da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return new E;
1764da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        default:
1774da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            // suppress warning
1784da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            return NULL;
1794da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
1804da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}
1814da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}
1824da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comstruct Rec {
1834da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    A* fInstance;
1844da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    int fValue;
1854da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com};
1864da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
1874da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comstatic void test_memory_pool(skiatest::Reporter* reporter) {
1884da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    // prealloc and min alloc sizes for the pool
1894da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static const size_t gSizes[][2] = {
1904da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {0, 0},
1914da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {10 * sizeof(A), 20 * sizeof(A)},
1924da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {100 * sizeof(A), 100 * sizeof(A)},
1934da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {500 * sizeof(A), 500 * sizeof(A)},
1944da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {10000 * sizeof(A), 0},
1954da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        {1, 100 * sizeof(A)},
1964da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    };
1974da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    // different percentages of creation vs deletion
1984da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static const float gCreateFraction[] = {1.f, .95f, 0.75f, .5f};
1994da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    // number of create/destroys per test
2004da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static const int kNumIters = 20000;
2014da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    // check that all the values stored in A objects are correct after this
2024da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    // number of iterations
2034da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    static const int kCheckPeriod = 500;
2044da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
2054da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    SkRandom r;
2064da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    for (size_t s = 0; s < SK_ARRAY_COUNT(gSizes); ++s) {
2074da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        A::SetAllocator(gSizes[s][0], gSizes[s][1]);
2084da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        for (size_t c = 0; c < SK_ARRAY_COUNT(gCreateFraction); ++c) {
2094da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            SkTDArray<Rec> instanceRecs;
2104da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            for (int i = 0; i < kNumIters; ++i) {
2114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                float createOrDestroy = r.nextUScalar1();
2124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                if (createOrDestroy < gCreateFraction[c] ||
2134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    0 == instanceRecs.count()) {
2144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    Rec* rec = instanceRecs.append();
2154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    rec->fInstance = A::Create(&r);
2164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    rec->fValue = static_cast<int>(r.nextU());
2174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    rec->fInstance->setValues(rec->fValue);
2184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                } else {
2194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    int d = r.nextRangeU(0, instanceRecs.count() - 1);
2204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    Rec& rec = instanceRecs[d];
2214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue));
2224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    delete rec.fInstance;
2234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    instanceRecs.removeShuffle(d);
2244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                }
2254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                if (0 == i % kCheckPeriod) {
2264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    for (int r = 0; r < instanceRecs.count(); ++r) {
2274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                        Rec& rec = instanceRecs[r];
2284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                        REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue));
2294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                    }
2304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                }
2314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            }
2324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            for (int i = 0; i < instanceRecs.count(); ++i) {
2334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                Rec& rec = instanceRecs[i];
2344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue));
2354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com                delete rec.fInstance;
2364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            }
2374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#ifdef SK_DEBUG
2384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com            REPORTER_ASSERT(reporter, !A::GetInstanceCount());
2394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#endif
2404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com        }
2414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com    }
2424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}
2434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
2444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "TestClassDef.h"
2454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comDEFINE_TESTCLASS("GrMemoryPool", GrMemoryPoolClass, test_memory_pool)
2464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com
247cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
248