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  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: http://svn.webkit.org/repository/webkit/trunk@83249 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent a388b25d
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.
......@@ -4031,8 +4031,14 @@
'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',
......
/*
* 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
/*
* 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());
}
}
/*
* 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
/*
* 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
/*
* 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;
}
}
/*
* 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;