| /* |
| * 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 "src/core/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); |
| } |
| |