未验证 提交 f44f50f3 编写于 作者: C Chinmay Garde 提交者: GitHub

Fix race in SkiaGPUObject unit-tests. (#16351)

There are two issues in the test as written:
* There is a race on the first check to dtor_task_queue_id which might be
  encountered if the calling thread is de-scheduled and the unref queue manages
  to collect the object before the end of the scope.
* Two threads were owning a shared object but we relied on the object to be
  collected on the unref queue.
上级 95468839
...@@ -88,12 +88,10 @@ TEST_F(SkiaGpuObjectTest, ObjectDestructor) { ...@@ -88,12 +88,10 @@ TEST_F(SkiaGpuObjectTest, ObjectDestructor) {
std::shared_ptr<fml::AutoResetWaitableEvent> latch = std::shared_ptr<fml::AutoResetWaitableEvent> latch =
std::make_shared<fml::AutoResetWaitableEvent>(); std::make_shared<fml::AutoResetWaitableEvent>();
fml::TaskQueueId dtor_task_queue_id(0); fml::TaskQueueId dtor_task_queue_id(0);
{
auto object = sk_make_sp<TestSkObject>(latch, &dtor_task_queue_id); auto object = sk_make_sp<TestSkObject>(latch, &dtor_task_queue_id);
SkiaGPUObject<TestSkObject> sk_object(object, unref_queue()); {
ASSERT_EQ(sk_object.get(), object); SkiaGPUObject<TestSkObject> sk_object(std::move(object), unref_queue());
ASSERT_EQ(dtor_task_queue_id, 0); // Verify that the default SkiaGPUObject dtor queues and unref.
} }
latch->Wait(); latch->Wait();
...@@ -106,29 +104,9 @@ TEST_F(SkiaGpuObjectTest, ObjectReset) { ...@@ -106,29 +104,9 @@ TEST_F(SkiaGpuObjectTest, ObjectReset) {
fml::TaskQueueId dtor_task_queue_id(0); fml::TaskQueueId dtor_task_queue_id(0);
SkiaGPUObject<TestSkObject> sk_object( SkiaGPUObject<TestSkObject> sk_object(
sk_make_sp<TestSkObject>(latch, &dtor_task_queue_id), unref_queue()); sk_make_sp<TestSkObject>(latch, &dtor_task_queue_id), unref_queue());
// Verify that explicitly resetting the GPU object queues and unref.
sk_object.reset();
ASSERT_EQ(sk_object.get(), nullptr);
latch->Wait();
ASSERT_EQ(dtor_task_queue_id, unref_task_runner()->GetTaskQueueId());
}
TEST_F(SkiaGpuObjectTest, ObjectResetBeforeDestructor) {
std::shared_ptr<fml::AutoResetWaitableEvent> latch =
std::make_shared<fml::AutoResetWaitableEvent>();
fml::TaskQueueId dtor_task_queue_id(0);
{
auto object = sk_make_sp<TestSkObject>(latch, &dtor_task_queue_id);
SkiaGPUObject<TestSkObject> sk_object(object, unref_queue());
ASSERT_EQ(sk_object.get(), object);
ASSERT_EQ(dtor_task_queue_id, 0);
sk_object.reset(); sk_object.reset();
ASSERT_EQ(sk_object.get(), nullptr); ASSERT_EQ(sk_object.get(), nullptr);
}
latch->Wait(); latch->Wait();
ASSERT_EQ(dtor_task_queue_id, unref_task_runner()->GetTaskQueueId()); ASSERT_EQ(dtor_task_queue_id, unref_task_runner()->GetTaskQueueId());
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册