1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CONTENT_CHILD_WEBTHREAD_IMPL_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CONTENT_CHILD_WEBTHREAD_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/threading/thread.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/content_export.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebThread.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CONTENT_EXPORT WebThreadBase : public blink::WebThread {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebThreadBase();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void addTaskObserver(TaskObserver* observer);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void removeTaskObserver(TaskObserver* observer);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool isCurrentThread() const = 0;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual blink::PlatformThreadId threadId() const = 0;
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebThreadBase();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class TaskObserverAdapter;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<TaskObserver*, TaskObserverAdapter*> TaskObserverMap;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskObserverMap task_observer_map_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CONTENT_EXPORT WebThreadImpl : public WebThreadBase {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit WebThreadImpl(const char* name);
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~WebThreadImpl();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void postTask(Task* task);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void postDelayedTask(Task* task, long long delay_ms);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void enterRunLoop();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void exitRunLoop();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop* message_loop() const { return thread_->message_loop(); }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool isCurrentThread() const OVERRIDE;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual blink::PlatformThreadId threadId() const OVERRIDE;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Thread> thread_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebThreadImplForMessageLoop : public WebThreadBase {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CONTENT_EXPORT explicit WebThreadImplForMessageLoop(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::MessageLoopProxy* message_loop);
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CONTENT_EXPORT virtual ~WebThreadImplForMessageLoop();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void postTask(Task* task) OVERRIDE;
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void postDelayedTask(Task* task, long long delay_ms) OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void enterRunLoop() OVERRIDE;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void exitRunLoop() OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool isCurrentThread() const OVERRIDE;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual blink::PlatformThreadId threadId() const OVERRIDE;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  blink::PlatformThreadId thread_id_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // CONTENT_CHILD_WEBTHREAD_IMPL_H_
80