| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/private/chromium/SkDiscardableMemory.h" | |
| #include "src/lazy/SkDiscardableMemoryPool.h" | |
| #include "tests/Test.h" | |
| #include <cstring> | |
| #include <memory> | |
| namespace { | |
| constexpr char kTestString[] = "HELLO, WORLD!"; | |
| constexpr size_t kTestStringLength = sizeof(kTestString); | |
| } // namespace | |
| static void test_dm(skiatest::Reporter* reporter, | |
| SkDiscardableMemory* dm, | |
| bool assertRelock) { | |
| REPORTER_ASSERT(reporter, dm); | |
| if (!dm) { | |
| return; | |
| } | |
| void* ptr = dm->data(); | |
| REPORTER_ASSERT(reporter, ptr); | |
| if (!ptr) { | |
| return; | |
| } | |
| memcpy(ptr, kTestString, sizeof(kTestString)); | |
| dm->unlock(); | |
| bool relockSuccess = dm->lock(); | |
| if (assertRelock) { | |
| REPORTER_ASSERT(reporter, relockSuccess); | |
| } | |
| if (!relockSuccess) { | |
| return; | |
| } | |
| ptr = dm->data(); | |
| REPORTER_ASSERT(reporter, ptr); | |
| if (!ptr) { | |
| return; | |
| } | |
| REPORTER_ASSERT(reporter, 0 == memcmp(ptr, kTestString, kTestStringLength)); | |
| dm->unlock(); | |
| } | |
| DEF_TEST(DiscardableMemory_global, reporter) { | |
| std::unique_ptr<SkDiscardableMemory> dm(SkDiscardableMemory::Create(kTestStringLength)); | |
| // lock() test is allowed to fail, since other threads could be | |
| // using global pool. | |
| test_dm(reporter, dm.get(), false); | |
| } | |
| DEF_TEST(DiscardableMemory_nonglobal, reporter) { | |
| sk_sp<SkDiscardableMemoryPool> pool( | |
| SkDiscardableMemoryPool::Make(1024)); | |
| std::unique_ptr<SkDiscardableMemory> dm(pool->create(kTestStringLength)); | |
| test_dm(reporter, dm.get(), true); | |
| } | |