skia2/tests/OncePtrTest.cpp
mtklein 6c59d80858 Port uses of SkLazyPtr to SkOncePtr.
This gives SkOncePtr a non-trivial destructor that uses std::default_delete
by default.  This is overrideable, as seen in SkColorTable.

SK_DECLARE_STATIC_ONCE_PTR still just leaves its pointers hanging at EOP.

BUG=skia:

No public API changes.
TBR=reed@google.com

Committed: https://skia.googlesource.com/skia/+/a1254acdb344174e761f5061c820559dab64a74c

Review URL: https://codereview.chromium.org/1322933005
2015-09-09 09:09:53 -07:00

49 lines
1.1 KiB
C++

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "Test.h"
#include "SkOncePtr.h"
#include "SkTaskGroup.h"
DEF_TEST(OncePtr, r) {
SkOncePtr<int> once;
static SkAtomic<int> calls(0);
auto create = [&] {
calls.fetch_add(1);
return new int(5);
};
SkAtomic<int> force_a_race(sk_num_cores());
sk_parallel_for(sk_num_cores()*4, [&](size_t) {
force_a_race.fetch_add(-1);
while (force_a_race.load() > 0);
int* n = once.get(create);
REPORTER_ASSERT(r, *n == 5);
});
REPORTER_ASSERT(r, calls.load() == 1);
}
/* TODO(mtklein): next CL
SK_DECLARE_STATIC_ONCE(once_noptr);
DEF_TEST(OnceNoPtr, r) {
static SkAtomic<int> calls(0);
SkAtomic<int> force_a_race(sk_num_cores());
sk_parallel_for(sk_num_cores()*4, [&](size_t) {
force_a_race.fetch_add(-1);
while (force_a_race.load() > 0);
SkOnce(&once_noptr, [&] { calls.fetch_add(1); });
});
REPORTER_ASSERT(r, calls.load() == 1);
}
*/