1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 9cb93a386Sopenharmony_ci#include "src/core/SkDiscardableMemory.h" 10cb93a386Sopenharmony_ci#include "src/lazy/SkDiscardableMemoryPool.h" 11cb93a386Sopenharmony_ci#include "tests/Test.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include <cstring> 14cb93a386Sopenharmony_ci#include <memory> 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cinamespace { 17cb93a386Sopenharmony_ciconstexpr char kTestString[] = "HELLO, WORLD!"; 18cb93a386Sopenharmony_ciconstexpr size_t kTestStringLength = sizeof(kTestString); 19cb93a386Sopenharmony_ci} // namespace 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cistatic void test_dm(skiatest::Reporter* reporter, 22cb93a386Sopenharmony_ci SkDiscardableMemory* dm, 23cb93a386Sopenharmony_ci bool assertRelock) { 24cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, dm); 25cb93a386Sopenharmony_ci if (!dm) { 26cb93a386Sopenharmony_ci return; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci void* ptr = dm->data(); 29cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, ptr); 30cb93a386Sopenharmony_ci if (!ptr) { 31cb93a386Sopenharmony_ci return; 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci memcpy(ptr, kTestString, sizeof(kTestString)); 34cb93a386Sopenharmony_ci dm->unlock(); 35cb93a386Sopenharmony_ci bool relockSuccess = dm->lock(); 36cb93a386Sopenharmony_ci if (assertRelock) { 37cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, relockSuccess); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci if (!relockSuccess) { 40cb93a386Sopenharmony_ci return; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci ptr = dm->data(); 43cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, ptr); 44cb93a386Sopenharmony_ci if (!ptr) { 45cb93a386Sopenharmony_ci return; 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 0 == memcmp(ptr, kTestString, kTestStringLength)); 48cb93a386Sopenharmony_ci dm->unlock(); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ciDEF_TEST(DiscardableMemory_global, reporter) { 52cb93a386Sopenharmony_ci std::unique_ptr<SkDiscardableMemory> dm(SkDiscardableMemory::Create(kTestStringLength)); 53cb93a386Sopenharmony_ci // lock() test is allowed to fail, since other threads could be 54cb93a386Sopenharmony_ci // using global pool. 55cb93a386Sopenharmony_ci test_dm(reporter, dm.get(), false); 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciDEF_TEST(DiscardableMemory_nonglobal, reporter) { 59cb93a386Sopenharmony_ci sk_sp<SkDiscardableMemoryPool> pool( 60cb93a386Sopenharmony_ci SkDiscardableMemoryPool::Make(1024)); 61cb93a386Sopenharmony_ci std::unique_ptr<SkDiscardableMemory> dm(pool->create(kTestStringLength)); 62cb93a386Sopenharmony_ci test_dm(reporter, dm.get(), true); 63cb93a386Sopenharmony_ci} 64cb93a386Sopenharmony_ci 65