| Index: webkit/glue/webthread_impl.cc
|
| diff --git a/webkit/glue/webthread_impl.cc b/webkit/glue/webthread_impl.cc
|
| index 236497e6891e07e6c64ddc005807b154ddca8631..ac32ccbc8fd9d8b757185341ad8874cae9fb02e3 100644
|
| --- a/webkit/glue/webthread_impl.cc
|
| +++ b/webkit/glue/webthread_impl.cc
|
| @@ -10,9 +10,48 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/message_loop.h"
|
| +#include "base/threading/platform_thread.h"
|
|
|
| namespace webkit_glue {
|
|
|
| +WebThreadBase::WebThreadBase() { }
|
| +WebThreadBase::~WebThreadBase() { }
|
| +
|
| +class WebThreadBase::TaskObserverAdapter : public MessageLoop::TaskObserver {
|
| +public:
|
| + TaskObserverAdapter(WebThread::TaskObserver* observer)
|
| + : observer_(observer) { }
|
| +
|
| + // WebThread::TaskObserver does not have a willProcessTask method.
|
| + virtual void WillProcessTask(base::TimeTicks) OVERRIDE { }
|
| +
|
| + virtual void DidProcessTask(base::TimeTicks) OVERRIDE {
|
| + observer_->didProcessTask();
|
| + }
|
| +
|
| +private:
|
| + WebThread::TaskObserver* observer_;
|
| +};
|
| +
|
| +void WebThreadBase::addTaskObserver(TaskObserver* observer) {
|
| + CHECK(IsCurrentThread());
|
| + std::pair<TaskObserverMap::iterator, bool> result = task_observer_map_.insert(
|
| + std::make_pair(observer, static_cast<TaskObserverAdapter*>(NULL)));
|
| + if (result.second)
|
| + result.first->second = new TaskObserverAdapter(observer);
|
| + MessageLoop::current()->AddTaskObserver(result.first->second);
|
| +}
|
| +
|
| +void WebThreadBase::removeTaskObserver(TaskObserver* observer) {
|
| + CHECK(IsCurrentThread());
|
| + TaskObserverMap::iterator iter = task_observer_map_.find(observer);
|
| + if (iter == task_observer_map_.end())
|
| + return;
|
| + MessageLoop::current()->RemoveTaskObserver(iter->second);
|
| + delete iter->second;
|
| + task_observer_map_.erase(iter);
|
| +}
|
| +
|
| WebThreadImpl::WebThreadImpl(const char* name)
|
| : thread_(new base::Thread(name)) {
|
| thread_->Start();
|
| @@ -22,6 +61,7 @@ void WebThreadImpl::postTask(Task* task) {
|
| thread_->message_loop()->PostTask(
|
| FROM_HERE, base::Bind(&WebKit::WebThread::Task::run, base::Owned(task)));
|
| }
|
| +
|
| void WebThreadImpl::postDelayedTask(
|
| Task* task, long long delay_ms) {
|
| thread_->message_loop()->PostDelayedTask(
|
| @@ -30,6 +70,10 @@ void WebThreadImpl::postDelayedTask(
|
| delay_ms);
|
| }
|
|
|
| +bool WebThreadImpl::IsCurrentThread() const {
|
| + return thread_->thread_id() == base::PlatformThread::CurrentId();
|
| +}
|
| +
|
| WebThreadImpl::~WebThreadImpl() {
|
| thread_->Stop();
|
| }
|
| @@ -52,6 +96,10 @@ void WebThreadImplForMessageLoop::postDelayedTask(
|
| delay_ms);
|
| }
|
|
|
| +bool WebThreadImplForMessageLoop::IsCurrentThread() const {
|
| + return message_loop_->BelongsToCurrentThread();
|
| +}
|
| +
|
| WebThreadImplForMessageLoop::~WebThreadImplForMessageLoop() {
|
| }
|
|
|
|
|