Home | History | Annotate | Download | only in child
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef WEBKIT_CHILD_WORKER_TASK_RUNNER_H_
      6 #define WEBKIT_CHILD_WORKER_TASK_RUNNER_H_
      7 
      8 #include <map>
      9 
     10 #include "base/atomic_sequence_num.h"
     11 #include "base/callback_forward.h"
     12 #include "base/synchronization/lock.h"
     13 #include "base/threading/thread_local.h"
     14 #include "third_party/WebKit/public/platform/WebWorkerRunLoop.h"
     15 #include "webkit/child/webkit_child_export.h"
     16 
     17 namespace webkit_glue {
     18 
     19 class WEBKIT_CHILD_EXPORT WorkerTaskRunner {
     20  public:
     21   WorkerTaskRunner();
     22 
     23   bool PostTask(int id, const base::Closure& task);
     24   int PostTaskToAllThreads(const base::Closure& task);
     25   int CurrentWorkerId();
     26   static WorkerTaskRunner* Instance();
     27 
     28   class WEBKIT_CHILD_EXPORT Observer {
     29    public:
     30     virtual ~Observer() {}
     31     virtual void OnWorkerRunLoopStopped() = 0;
     32   };
     33   // Add/Remove an observer that will get notified when the current worker run
     34   // loop is stopping. This observer will not get notified when other threads
     35   // are stopping.  It's only valid to call these on a worker thread.
     36   void AddStopObserver(Observer* observer);
     37   void RemoveStopObserver(Observer* observer);
     38 
     39  private:
     40   friend class WebKitPlatformSupportChildImpl;
     41   friend class WorkerTaskRunnerTest;
     42 
     43   typedef std::map<int, WebKit::WebWorkerRunLoop> IDToLoopMap;
     44 
     45   ~WorkerTaskRunner();
     46   void OnWorkerRunLoopStarted(const WebKit::WebWorkerRunLoop& loop);
     47   void OnWorkerRunLoopStopped(const WebKit::WebWorkerRunLoop& loop);
     48 
     49   struct ThreadLocalState;
     50   base::ThreadLocalPointer<ThreadLocalState> current_tls_;
     51 
     52   base::AtomicSequenceNumber id_sequence_;
     53   IDToLoopMap loop_map_;
     54   base::Lock loop_map_lock_;
     55 };
     56 
     57 }  // namespace webkit_glue
     58 
     59 #endif // WEBKIT_CHILD_WORKER_TASK_RUNNER_H_
     60