2011-04-07 Nat Duca <nduca@chromium.org>
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Apr 2011 04:32:04 +0000 (04:32 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 8 Apr 2011 04:32:04 +0000 (04:32 +0000)
        Reviewed by David Levin.

        [chromium] Compositor thread infrastructure
        https://bugs.webkit.org/show_bug.cgi?id=56131

        Introduce chrome compositor thread and related
        infrastructure.

        * WebCore.gypi:
        * platform/graphics/chromium/cc/CCMainThread.cpp: Added.
        (WebCore::CCMainThread::performTask):
        (WebCore::CCMainThread::postTask):
        * platform/graphics/chromium/cc/CCMainThread.h: Added.
        (WebCore::CCMainThread::Task::~Task):
        (WebCore::CCMainThread::Task::instance):
        (WebCore::CCMainThread::Task::Task):
        * platform/graphics/chromium/cc/CCMainThreadTask.h: Added.
        (WebCore::MainThreadTask0::create):
        (WebCore::MainThreadTask0::MainThreadTask0):
        (WebCore::MainThreadTask0::performTask):
        (WebCore::MainThreadTask1::create):
        (WebCore::MainThreadTask1::MainThreadTask1):
        (WebCore::MainThreadTask1::performTask):
        (WebCore::MainThreadTask2::create):
        (WebCore::MainThreadTask2::MainThreadTask2):
        (WebCore::MainThreadTask2::performTask):
        (WebCore::MainThreadTask3::create):
        (WebCore::MainThreadTask3::MainThreadTask3):
        (WebCore::MainThreadTask3::performTask):
        (WebCore::createMainThreadTask):
        * platform/graphics/chromium/cc/CCThread.cpp: Added.
        (WebCore::CCThread::create):
        (WebCore::CCThread::CCThread):
        (WebCore::CCThread::~CCThread):
        (WebCore::CCThread::postTask):
        (WebCore::CCThread::compositorThreadStart):
        (WebCore::CCThread::runLoop):
        * platform/graphics/chromium/cc/CCThread.h: Added.
        (WebCore::CCThread::Task::~Task):
        (WebCore::CCThread::Task::instance):
        (WebCore::CCThread::Task::Task):
        (WebCore::CCThread::threadID):
        (WebCore::CCCompletionEvent::CCCompletionEvent):
        (WebCore::CCCompletionEvent::~CCCompletionEvent):
        (WebCore::CCCompletionEvent::wait):
        (WebCore::CCCompletionEvent::signal):
        * platform/graphics/chromium/cc/CCThreadTask.h: Added.
        (WebCore::CCThreadTask0::create):
        (WebCore::CCThreadTask0::CCThreadTask0):
        (WebCore::CCThreadTask0::performTask):
        (WebCore::CCThreadTask1::create):
        (WebCore::CCThreadTask1::CCThreadTask1):
        (WebCore::CCThreadTask1::performTask):
        (WebCore::CCThreadTask2::create):
        (WebCore::CCThreadTask2::CCThreadTask2):
        (WebCore::CCThreadTask2::performTask):
        (WebCore::CCThreadTask3::create):
        (WebCore::CCThreadTask3::CCThreadTask3):
        (WebCore::CCThreadTask3::performTask):
        (WebCore::createCCThreadTask):
2011-04-07  Nat Duca  <nduca@chromium.org>

        Reviewed by David Levin.

        [chromium] Compositor thread infrastructure
        https://bugs.webkit.org/show_bug.cgi?id=56131

        Tests for chrome compositor thread and related infrastructure.

        * WebKit.gyp:
        * WebKit.gypi:
        * tests/CCThreadTaskTest.cpp: Added.
        (WebCore::TEST):
        * tests/CCThreadTest.cpp: Added.
        (WebCore::TEST):
        (WebCore::PingPongUsingCondition::ping):
        (WebCore::PingPongTestUsingTasks::ping):
        (WebCore::PingPongTestUsingTasks::pong):
        * tests/RunAllTests.cpp:
        (main):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@83249 268f45cc-cd09-0410-ab3c-d52691b4dbfc

15 files changed:
Source/WebCore/ChangeLog
Source/WebCore/WebCore.gypi
Source/WebCore/platform/graphics/chromium/cc/CCCompletionEvent.h [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCMainThread.cpp [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCMainThread.h [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCMainThreadTask.h [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCThread.cpp [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCThread.h [new file with mode: 0644]
Source/WebCore/platform/graphics/chromium/cc/CCThreadTask.h [new file with mode: 0644]
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gyp
Source/WebKit/chromium/WebKit.gypi
Source/WebKit/chromium/tests/CCThreadTaskTest.cpp [new file with mode: 0644]
Source/WebKit/chromium/tests/CCThreadTest.cpp [new file with mode: 0644]
Source/WebKit/chromium/tests/RunAllTests.cpp

index 22c6f14..7e6acdf 100644 (file)
@@ -1,3 +1,66 @@
+2011-04-07  Nat Duca  <nduca@chromium.org>
+
+        Reviewed by David Levin.
+
+        [chromium] Compositor thread infrastructure
+        https://bugs.webkit.org/show_bug.cgi?id=56131
+
+        Introduce chrome compositor thread and related
+        infrastructure.
+
+        * WebCore.gypi:
+        * platform/graphics/chromium/cc/CCMainThread.cpp: Added.
+        (WebCore::CCMainThread::performTask):
+        (WebCore::CCMainThread::postTask):
+        * platform/graphics/chromium/cc/CCMainThread.h: Added.
+        (WebCore::CCMainThread::Task::~Task):
+        (WebCore::CCMainThread::Task::instance):
+        (WebCore::CCMainThread::Task::Task):
+        * platform/graphics/chromium/cc/CCMainThreadTask.h: Added.
+        (WebCore::MainThreadTask0::create):
+        (WebCore::MainThreadTask0::MainThreadTask0):
+        (WebCore::MainThreadTask0::performTask):
+        (WebCore::MainThreadTask1::create):
+        (WebCore::MainThreadTask1::MainThreadTask1):
+        (WebCore::MainThreadTask1::performTask):
+        (WebCore::MainThreadTask2::create):
+        (WebCore::MainThreadTask2::MainThreadTask2):
+        (WebCore::MainThreadTask2::performTask):
+        (WebCore::MainThreadTask3::create):
+        (WebCore::MainThreadTask3::MainThreadTask3):
+        (WebCore::MainThreadTask3::performTask):
+        (WebCore::createMainThreadTask):
+        * platform/graphics/chromium/cc/CCThread.cpp: Added.
+        (WebCore::CCThread::create):
+        (WebCore::CCThread::CCThread):
+        (WebCore::CCThread::~CCThread):
+        (WebCore::CCThread::postTask):
+        (WebCore::CCThread::compositorThreadStart):
+        (WebCore::CCThread::runLoop):
+        * platform/graphics/chromium/cc/CCThread.h: Added.
+        (WebCore::CCThread::Task::~Task):
+        (WebCore::CCThread::Task::instance):
+        (WebCore::CCThread::Task::Task):
+        (WebCore::CCThread::threadID):
+        (WebCore::CCCompletionEvent::CCCompletionEvent):
+        (WebCore::CCCompletionEvent::~CCCompletionEvent):
+        (WebCore::CCCompletionEvent::wait):
+        (WebCore::CCCompletionEvent::signal):
+        * platform/graphics/chromium/cc/CCThreadTask.h: Added.
+        (WebCore::CCThreadTask0::create):
+        (WebCore::CCThreadTask0::CCThreadTask0):
+        (WebCore::CCThreadTask0::performTask):
+        (WebCore::CCThreadTask1::create):
+        (WebCore::CCThreadTask1::CCThreadTask1):
+        (WebCore::CCThreadTask1::performTask):
+        (WebCore::CCThreadTask2::create):
+        (WebCore::CCThreadTask2::CCThreadTask2):
+        (WebCore::CCThreadTask2::performTask):
+        (WebCore::CCThreadTask3::create):
+        (WebCore::CCThreadTask3::CCThreadTask3):
+        (WebCore::CCThreadTask3::performTask):
+        (WebCore::createCCThreadTask):
+
 2011-04-07  Ryosuke Niwa  <rniwa@webkit.org>
 
         Reviewed by Eric Seidel.
index dcf269c..d800322 100644 (file)
             'platform/graphics/chromium/cc/CCHeadsUpDisplay.h',
             'platform/graphics/chromium/cc/CCLayerImpl.cpp',
             'platform/graphics/chromium/cc/CCLayerImpl.h',
+            'platform/graphics/chromium/cc/CCMainThread.cpp',
+            'platform/graphics/chromium/cc/CCMainThread.h',
+            'platform/graphics/chromium/cc/CCMainThreadTask.h',
             'platform/graphics/chromium/cc/CCPluginLayerImpl.cpp',
             'platform/graphics/chromium/cc/CCPluginLayerImpl.h',
+            'platform/graphics/chromium/cc/CCThread.cpp',
+            'platform/graphics/chromium/cc/CCThread.h',
+            'platform/graphics/chromium/cc/CCThreadTask.h',
             'platform/graphics/chromium/cc/CCVideoLayerImpl.cpp',
             'platform/graphics/chromium/cc/CCVideoLayerImpl.h',
             'platform/graphics/cocoa/FontPlatformDataCocoa.mm',
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCCompletionEvent.h b/Source/WebCore/platform/graphics/chromium/cc/CCCompletionEvent.h
new file mode 100644 (file)
index 0000000..a8ac151
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef CCCompletionEvent_h
+#define CCCompletionEvent_h
+
+#include <wtf/ThreadingPrimitives.h>
+
+namespace WebCore {
+
+class CCCompletionEvent {
+public:
+    CCCompletionEvent()
+    {
+        m_mutex.lock();
+    }
+
+    ~CCCompletionEvent()
+    {
+        m_mutex.unlock();
+    }
+
+    void wait()
+    {
+        m_condition.wait(m_mutex);
+    }
+
+    void signal()
+    {
+        MutexLocker lock(m_mutex);
+        m_condition.signal();
+    }
+
+private:
+    Mutex m_mutex;
+    ThreadCondition m_condition;
+};
+
+}
+
+#endif
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCMainThread.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCMainThread.cpp
new file mode 100644 (file)
index 0000000..cd36817
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "config.h"
+
+#include "CCMainThread.h"
+
+#include <wtf/MainThread.h>
+
+using namespace WTF;
+
+namespace WebCore {
+
+void CCMainThread::performTask(void* userdata)
+{
+    Task* task = static_cast<Task*>(userdata);
+    task->performTask();
+    delete task;
+}
+
+void CCMainThread::postTask(PassOwnPtr<Task> task)
+{
+    callOnMainThread(performTask, task.leakPtr());
+}
+
+}
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCMainThread.h b/Source/WebCore/platform/graphics/chromium/cc/CCMainThread.h
new file mode 100644 (file)
index 0000000..ca8e8c1
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef CCMainThread_h
+#define CCMainThread_h
+
+#include <wtf/Noncopyable.h>
+#include <wtf/PassOwnPtr.h>
+
+namespace WebCore {
+
+// Task wrapper around WTF::callOnMainThreadThread
+class CCMainThread {
+public:
+    class Task {
+        WTF_MAKE_NONCOPYABLE(Task);
+    public:
+        virtual ~Task() { }
+        virtual void performTask() = 0;
+        void* instance() const { return m_instance; }
+    protected:
+        Task(void* instance) : m_instance(instance) { }
+        void* m_instance;
+    };
+
+    static void postTask(PassOwnPtr<Task>); // Executes the task on main thread asynchronously.
+private:
+    static void performTask(void*);
+};
+
+} // namespace WebCore
+
+#endif // CCMainThread_h
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCMainThreadTask.h b/Source/WebCore/platform/graphics/chromium/cc/CCMainThreadTask.h
new file mode 100644 (file)
index 0000000..7de8d71
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef CCMainThreadTask_h
+#define CCMainThreadTask_h
+
+#include "CCMainThread.h"
+#include "CrossThreadCopier.h"
+#include "CrossThreadTask.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+template<typename T>
+class MainThreadTask0 : public CCMainThread::Task {
+public:
+    typedef void (T::*Method)();
+    typedef MainThreadTask0<T> MainThreadTaskImpl;
+
+    static PassOwnPtr<MainThreadTaskImpl> create(T* instance, Method method)
+    {
+        return adoptPtr(new MainThreadTaskImpl(instance, method));
+    }
+
+private:
+    MainThreadTask0(T* instance, Method method)
+        : CCMainThread::Task(instance)
+        , m_method(method)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)();
+    }
+
+private:
+    Method m_method;
+};
+
+template<typename T, typename P1, typename MP1>
+class MainThreadTask1 : public CCMainThread::Task {
+public:
+    typedef void (T::*Method)(MP1);
+    typedef MainThreadTask1<T, P1, MP1> MainThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+
+    static PassOwnPtr<MainThreadTaskImpl> create(T* instance, Method method, Param1 parameter1)
+    {
+        return adoptPtr(new MainThreadTaskImpl(instance, method, parameter1));
+    }
+
+private:
+    MainThreadTask1(T* instance, Method method, Param1 parameter1)
+        : CCMainThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+};
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2>
+class MainThreadTask2 : public CCMainThread::Task {
+public:
+    typedef void (T::*Method)(MP1, MP2);
+    typedef MainThreadTask2<T, P1, MP1, P2, MP2> MainThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
+
+    static PassOwnPtr<MainThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2)
+    {
+        return adoptPtr(new MainThreadTaskImpl(instance, method, parameter1, parameter2));
+    }
+
+private:
+    MainThreadTask2(T* instance, Method method, Param1 parameter1, Param2 parameter2)
+        : CCMainThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+        , m_parameter2(parameter2)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+    P2 m_parameter2;
+};
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
+class MainThreadTask3 : public CCMainThread::Task {
+public:
+    typedef void (T::*Method)(MP1, MP2, MP3);
+    typedef MainThreadTask3<T, P1, MP1, P2, MP2, P3, MP3> MainThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
+    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
+
+    static PassOwnPtr<MainThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
+    {
+        return adoptPtr(new MainThreadTaskImpl(instance, method, parameter1, parameter2, parameter3));
+    }
+
+private:
+    MainThreadTask3(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
+        : CCMainThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+        , m_parameter2(parameter2)
+        , m_parameter3(parameter3)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+    P2 m_parameter2;
+    P3 m_parameter3;
+};
+
+template<typename T>
+PassOwnPtr<CCMainThread::Task> createMainThreadTask(
+    T* const callee,
+    void (T::*method)());
+
+template<typename T>
+PassOwnPtr<CCMainThread::Task> createMainThreadTask(
+    T* const callee,
+    void (T::*method)())
+{
+    return MainThreadTask0<T>::create(
+        callee,
+        method);
+}
+
+template<typename T, typename P1, typename MP1>
+PassOwnPtr<CCMainThread::Task> createMainThreadTask(
+    T* const callee,
+    void (T::*method)(MP1),
+    const P1& parameter1)
+{
+    return MainThreadTask1<T, typename CrossThreadCopier<P1>::Type, MP1>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1));
+}
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2>
+PassOwnPtr<CCMainThread::Task> createMainThreadTask(
+    T* const callee,
+    void (T::*method)(MP1, MP2),
+    const P1& parameter1,
+    const P2& parameter2)
+{
+    return MainThreadTask2<T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1),
+        CrossThreadCopier<P2>::copy(parameter2));
+}
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
+PassOwnPtr<CCMainThread::Task> createMainThreadTask(
+    T* const callee,
+    void (T::*method)(MP1, MP2, MP3),
+    const P1& parameter1,
+    const P2& parameter2,
+    const P3& parameter3)
+{
+    return MainThreadTask3<T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1),
+        CrossThreadCopier<P2>::copy(parameter2),
+        CrossThreadCopier<P3>::copy(parameter3));
+}
+
+} // namespace WebCore
+
+#endif // CCMainThreadTask_h
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCThread.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCThread.cpp
new file mode 100644 (file)
index 0000000..3f64dfc
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "CCThread.h"
+
+#include "LayerRendererChromium.h"
+#include <wtf/CurrentTime.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/ThreadingPrimitives.h>
+
+namespace WebCore {
+
+using namespace WTF;
+
+CCThread::CCThread()
+{
+    MutexLocker lock(m_threadCreationMutex);
+    m_threadID = createThread(CCThread::compositorThreadStart, this, "Chromium Compositor");
+}
+
+CCThread::~CCThread()
+{
+    m_queue.kill();
+
+    // Stop thread.
+    void* exitCode;
+    waitForThreadCompletion(m_threadID, &exitCode);
+    m_threadID = 0;
+}
+
+void CCThread::postTask(PassOwnPtr<Task> task)
+{
+    m_queue.append(task);
+}
+
+void* CCThread::compositorThreadStart(void* userdata)
+{
+    CCThread* ccThread = static_cast<CCThread*>(userdata);
+    return ccThread->runLoop();
+}
+
+void* CCThread::runLoop()
+{
+    {
+        // Wait for CCThread::start() to complete to have m_threadID
+        // established before starting the main loop.
+        MutexLocker lock(m_threadCreationMutex);
+    }
+
+    while (OwnPtr<Task> task = m_queue.waitForMessage())
+        task->performTask();
+
+    detachThread(m_threadID);
+
+    return 0;
+}
+
+}
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCThread.h b/Source/WebCore/platform/graphics/chromium/cc/CCThread.h
new file mode 100644 (file)
index 0000000..177d3f3
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef CCThread_h
+#define CCThread_h
+
+#include <wtf/MessageQueue.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/Threading.h>
+
+namespace WebCore {
+
+// The CCThread singleton owns the compositor thread and provides
+// basic infrastructure for messaging between the two threads.
+class CCThread {
+public:
+    static PassOwnPtr<CCThread> create()
+    {
+        return adoptPtr(new CCThread());
+    }
+
+    virtual ~CCThread();
+
+    class Task {
+        WTF_MAKE_NONCOPYABLE(Task);
+    public:
+        virtual ~Task() { }
+        virtual void performTask() = 0;
+        void* instance() const { return m_instance; }
+    protected:
+        Task(void* instance) : m_instance(instance) { }
+        void* m_instance;
+    };
+
+    void postTask(PassOwnPtr<Task>); // Executes the task on context's thread asynchronously.
+
+    WTF::ThreadIdentifier threadID() const { return m_threadID; }
+
+protected:
+    explicit CCThread();
+
+    static void* compositorThreadStart(void*);
+    void* runLoop();
+
+    WTF::ThreadIdentifier m_threadID;
+    MessageQueue<Task> m_queue;
+
+    Mutex m_threadCreationMutex;
+};
+
+}
+
+#endif
diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCThreadTask.h b/Source/WebCore/platform/graphics/chromium/cc/CCThreadTask.h
new file mode 100644 (file)
index 0000000..71245d3
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef CCThreadTask_h
+#define CCThreadTask_h
+
+#include "CCThread.h"
+#include "CrossThreadCopier.h"
+#include "CrossThreadTask.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+
+namespace WebCore {
+
+template<typename T>
+class CCThreadTask0 : public CCThread::Task {
+public:
+    typedef void (T::*Method)();
+    typedef CCThreadTask0<T> CCThreadTaskImpl;
+
+    static PassOwnPtr<CCThreadTaskImpl> create(T* instance, Method method)
+    {
+        return adoptPtr(new CCThreadTaskImpl(instance, method));
+    }
+
+private:
+    CCThreadTask0(T* instance, Method method)
+        : CCThread::Task(instance)
+        , m_method(method)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)();
+    }
+
+private:
+    Method m_method;
+};
+
+template<typename T, typename P1, typename MP1>
+class CCThreadTask1 : public CCThread::Task {
+public:
+    typedef void (T::*Method)(MP1);
+    typedef CCThreadTask1<T, P1, MP1> CCThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+
+    static PassOwnPtr<CCThreadTaskImpl> create(T* instance, Method method, Param1 parameter1)
+    {
+        return adoptPtr(new CCThreadTaskImpl(instance, method, parameter1));
+    }
+
+private:
+    CCThreadTask1(T* instance, Method method, Param1 parameter1)
+        : CCThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+};
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2>
+class CCThreadTask2 : public CCThread::Task {
+public:
+    typedef void (T::*Method)(MP1, MP2);
+    typedef CCThreadTask2<T, P1, MP1, P2, MP2> CCThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
+
+    static PassOwnPtr<CCThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2)
+    {
+        return adoptPtr(new CCThreadTaskImpl(instance, method, parameter1, parameter2));
+    }
+
+private:
+    CCThreadTask2(T* instance, Method method, Param1 parameter1, Param2 parameter2)
+        : CCThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+        , m_parameter2(parameter2)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+    P2 m_parameter2;
+};
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
+class CCThreadTask3 : public CCThread::Task {
+public:
+    typedef void (T::*Method)(MP1, MP2, MP3);
+    typedef CCThreadTask3<T, P1, MP1, P2, MP2, P3, MP3> CCThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
+    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
+
+    static PassOwnPtr<CCThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
+    {
+        return adoptPtr(new CCThreadTaskImpl(instance, method, parameter1, parameter2, parameter3));
+    }
+
+private:
+    CCThreadTask3(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)
+        : CCThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+        , m_parameter2(parameter2)
+        , m_parameter3(parameter3)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+    P2 m_parameter2;
+    P3 m_parameter3;
+};
+
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
+class CCThreadTask4 : public CCThread::Task {
+public:
+    typedef void (T::*Method)(MP1, MP2, MP3, MP4);
+    typedef CCThreadTask4<T, P1, MP1, P2, MP2, P3, MP3, P4, MP4> CCThreadTaskImpl;
+    typedef typename CrossThreadTaskTraits<P1>::ParamType Param1;
+    typedef typename CrossThreadTaskTraits<P2>::ParamType Param2;
+    typedef typename CrossThreadTaskTraits<P3>::ParamType Param3;
+    typedef typename CrossThreadTaskTraits<P4>::ParamType Param4;
+
+    static PassOwnPtr<CCThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
+    {
+        return adoptPtr(new CCThreadTaskImpl(instance, method, parameter1, parameter2, parameter3, parameter4));
+    }
+
+private:
+    CCThreadTask4(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4)
+        : CCThread::Task(instance)
+        , m_method(method)
+        , m_parameter1(parameter1)
+        , m_parameter2(parameter2)
+        , m_parameter3(parameter3)
+        , m_parameter4(parameter4)
+    {
+    }
+
+    virtual void performTask()
+    {
+        (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3, m_parameter4);
+    }
+
+private:
+    Method m_method;
+    P1 m_parameter1;
+    P2 m_parameter2;
+    P3 m_parameter3;
+    P4 m_parameter4;
+};
+
+template<typename T>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)());
+
+template<typename T>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)())
+{
+    return CCThreadTask0<T>::create(
+        callee,
+        method);
+}
+
+template<typename T, typename P1, typename MP1>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)(MP1),
+    const P1& parameter1)
+{
+    return CCThreadTask1<T, typename CrossThreadCopier<P1>::Type, MP1>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1));
+}
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)(MP1, MP2),
+    const P1& parameter1,
+    const P2& parameter2)
+{
+    return CCThreadTask2<T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1),
+        CrossThreadCopier<P2>::copy(parameter2));
+}
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)(MP1, MP2, MP3),
+    const P1& parameter1,
+    const P2& parameter2,
+    const P3& parameter3)
+{
+    return CCThreadTask3<T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1),
+        CrossThreadCopier<P2>::copy(parameter2),
+        CrossThreadCopier<P3>::copy(parameter3));
+}
+
+template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
+PassOwnPtr<CCThread::Task> createCCThreadTask(
+    T* const callee,
+    void (T::*method)(MP1, MP2, MP3, MP4),
+    const P1& parameter1,
+    const P2& parameter2,
+    const P3& parameter3,
+    const P4& parameter4)
+{
+    return CCThreadTask4<T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, typename CrossThreadCopier<P4>::Type, MP4>::create(
+        callee,
+        method,
+        CrossThreadCopier<P1>::copy(parameter1),
+        CrossThreadCopier<P2>::copy(parameter2),
+        CrossThreadCopier<P3>::copy(parameter3),
+        CrossThreadCopier<P4>::copy(parameter4));
+
+}
+
+} // namespace WebCore
+
+#endif // CCThreadTask_h
index 9bd9534..7b94480 100644 (file)
@@ -1,3 +1,24 @@
+2011-04-07  Nat Duca  <nduca@chromium.org>
+
+        Reviewed by David Levin.
+
+        [chromium] Compositor thread infrastructure
+        https://bugs.webkit.org/show_bug.cgi?id=56131
+
+        Tests for chrome compositor thread and related infrastructure.
+
+        * WebKit.gyp:
+        * WebKit.gypi:
+        * tests/CCThreadTaskTest.cpp: Added.
+        (WebCore::TEST):
+        * tests/CCThreadTest.cpp: Added.
+        (WebCore::TEST):
+        (WebCore::PingPongUsingCondition::ping):
+        (WebCore::PingPongTestUsingTasks::ping):
+        (WebCore::PingPongTestUsingTasks::pong):
+        * tests/RunAllTests.cpp:
+        (main):
+
 2011-04-07  Andrew Scherkus  <scherkus@chromium.org>
 
         Revert ENABLE_TRACK patch due to compile failures.
index 263b49e..03896a0 100644 (file)
                                 '<(chromium_src_dir)/base/base.gyp:test_support_base',
                                 '<(chromium_src_dir)/build/temp_gyp/googleurl.gyp:googleurl',
                                 '<(chromium_src_dir)/testing/gtest.gyp:gtest',
+                                '<(chromium_src_dir)/testing/gmock.gyp:gmock',
                                 '<(chromium_src_dir)/third_party/icu/icu.gyp:*',
                                 '<(chromium_src_dir)/third_party/libjpeg/libjpeg.gyp:libjpeg',
                                 '<(chromium_src_dir)/third_party/libpng/libpng.gyp:libpng',
                 'webkit',
                 '../../WebCore/WebCore.gyp/WebCore.gyp:webcore',
                 '<(chromium_src_dir)/testing/gtest.gyp:gtest',
+                '<(chromium_src_dir)/testing/gmock.gyp:gmock',
                 '<(chromium_src_dir)/base/base.gyp:base',
                 '<(chromium_src_dir)/base/base.gyp:base_i18n',
                 '<(chromium_src_dir)/base/base.gyp:test_support_base',
index 016cf1a..30683ef 100644 (file)
@@ -53,6 +53,8 @@
         ],
         'webkit_unittest_files': [
             'tests/ArenaTestHelpers.h',
+            'tests/CCThreadTaskTest.cpp',
+            'tests/CCThreadTest.cpp',
             'tests/DragImageTest.cpp',
             'tests/IDBBindingUtilitiesTest.cpp',
             'tests/IDBKeyPathTest.cpp',
diff --git a/Source/WebKit/chromium/tests/CCThreadTaskTest.cpp b/Source/WebKit/chromium/tests/CCThreadTaskTest.cpp
new file mode 100644 (file)
index 0000000..1c5f877
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "cc/CCThreadTask.h"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace WTF;
+using namespace WebCore;
+
+namespace {
+
+class Mock {
+public:
+    MOCK_METHOD0(method0, void());
+    MOCK_METHOD1(method1, void(int a1));
+    MOCK_METHOD2(method2, void(int a1, int a2));
+    MOCK_METHOD3(method3, void(int a1, int a2, int a3));
+    MOCK_METHOD4(method4, void(int a1, int a2, int a3, int a4));
+};
+
+TEST(CCThreadTaskTest, runnableMethods)
+{
+    Mock mock;
+    EXPECT_CALL(mock, method0()).Times(1);
+    EXPECT_CALL(mock, method1(9)).Times(1);
+    EXPECT_CALL(mock, method2(9, 8)).Times(1);
+    EXPECT_CALL(mock, method3(9, 8, 7)).Times(1);
+    EXPECT_CALL(mock, method4(9, 8, 7, 6)).Times(1);
+
+    createCCThreadTask(&mock, &Mock::method0)->performTask();
+    createCCThreadTask(&mock, &Mock::method1, 9)->performTask();
+    createCCThreadTask(&mock, &Mock::method2, 9, 8)->performTask();
+    createCCThreadTask(&mock, &Mock::method3, 9, 8, 7)->performTask();
+    createCCThreadTask(&mock, &Mock::method4, 9, 8, 7, 6)->performTask();
+}
+
+} // namespace
diff --git a/Source/WebKit/chromium/tests/CCThreadTest.cpp b/Source/WebKit/chromium/tests/CCThreadTest.cpp
new file mode 100644 (file)
index 0000000..04fba46
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "cc/CCThread.h"
+
+#include "cc/CCCompletionEvent.h"
+#include "cc/CCMainThreadTask.h"
+#include "cc/CCThreadTask.h"
+#include <gtest/gtest.h>
+#include <webkit/support/webkit_support.h>
+
+using namespace WebCore;
+
+namespace {
+
+class PingPongUsingCondition {
+public:
+    void ping(CCCompletionEvent* completion)
+    {
+        hitThreadID = currentThread();
+        completion->signal();
+    }
+
+    ThreadIdentifier hitThreadID;
+};
+
+
+TEST(CCThreadTest, pingPongUsingCondition)
+{
+    OwnPtr<CCThread> thread = CCThread::create();
+    PingPongUsingCondition target;
+    CCCompletionEvent completion;
+    thread->postTask(createCCThreadTask(&target, &PingPongUsingCondition::ping, &completion));
+    completion.wait();
+
+    EXPECT_EQ(thread->threadID(), target.hitThreadID);
+}
+
+class PingPongTestUsingTasks {
+public:
+    void ping()
+    {
+        CCMainThread::postTask(createMainThreadTask(this, &PingPongTestUsingTasks::pong));
+        hit = true;
+    }
+
+    void pong()
+    {
+        EXPECT_TRUE(isMainThread());
+        webkit_support::QuitMessageLoop();
+    }
+
+    bool hit;
+};
+
+TEST(CCThreadTest, startPostAndWaitOnCondition)
+{
+    OwnPtr<CCThread> thread = CCThread::create();
+
+    PingPongTestUsingTasks target;
+    thread->postTask(createCCThreadTask(&target, &PingPongTestUsingTasks::ping));
+    webkit_support::RunMessageLoop();
+
+    EXPECT_TRUE(target.hit);
+}
+
+} // namespace
index b213de7..500c3dc 100644 (file)
 #include "WebUnitTests.h"
 #endif
 
+#include <gmock/gmock.h>
+
 int main(int argc, char** argv)
 {
+    ::testing::InitGoogleMock(&argc, argv);
     TestSuite testSuite(argc, argv);
     // TestSuite must be created before SetUpTestEnvironment so it performs
     // initializations needed by WebKit support.