Commit c93940b9 authored by tkent@chromium.org's avatar tkent@chromium.org

Apply WTF::ParamStorageTraits<> to CrossThreadTaskN.

Before this CL, a pointer to a GarbageCollected object is stored by RawPtr<T> or
T* in CrossThreadTaskN.  If a GC happened before the task is performed,
the object can be swept.

Applying ParamStorageTraits makes it CrossThreadPersistent<T>, and
we can safely use createCrossThreadTask() for GarbageCollected objects.

BUG=378192

Review URL: https://codereview.chromium.org/934963003

git-svn-id: svn://svn.chromium.org/blink/trunk@190638 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 05296b45
......@@ -3744,6 +3744,7 @@
'css/parser/SizesCalcParserTest.cpp',
'css/resolver/FontBuilderTest.cpp',
'dom/ActiveDOMObjectTest.cpp',
'dom/CrossThreadTaskTest.cpp',
'dom/DOMImplementationTest.cpp',
'dom/DocumentMarkerControllerTest.cpp',
'dom/DocumentTest.cpp',
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/dom/CrossThreadTask.h"
#include "platform/heap/Handle.h"
#include <gtest/gtest.h>
namespace blink {
class GCObject : public GarbageCollectedFinalized<GCObject> {
public:
static int s_counter;
GCObject() { ++s_counter; }
~GCObject() { --s_counter; }
DEFINE_INLINE_TRACE() { }
void run(GCObject*) { }
};
int GCObject::s_counter = 0;
static void functionWithGarbageCollected(GCObject*)
{
}
static void functionWithExecutionContext(ExecutionContext*, GCObject*)
{
}
class CrossThreadTaskTest : public testing::Test {
protected:
void SetUp() override
{
GCObject::s_counter = 0;
}
void TearDown() override
{
Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
ASSERT_EQ(0, GCObject::s_counter);
}
};
TEST_F(CrossThreadTaskTest, CreateForGarbageCollectedMethod)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&GCObject::run, new GCObject, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&GCObject::run, RawPtr<GCObject>(new GCObject), RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
EXPECT_EQ(4, GCObject::s_counter);
}
TEST_F(CrossThreadTaskTest, CreateForFunctionWithGarbageCollected)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&functionWithGarbageCollected, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&functionWithGarbageCollected, RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
EXPECT_EQ(2, GCObject::s_counter);
}
TEST_F(CrossThreadTaskTest, CreateForFunctionWithExecutionContext)
{
OwnPtr<ExecutionContextTask> task1 = createCrossThreadTask(&functionWithExecutionContext, new GCObject);
OwnPtr<ExecutionContextTask> task2 = createCrossThreadTask(&functionWithExecutionContext, RawPtr<GCObject>(new GCObject));
Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
EXPECT_EQ(2, GCObject::s_counter);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment