Home | History | Annotate | Download | only in base
      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 REMOTING_BASE_AUTO_THREAD_TASK_RUNNER_H_
      6 #define REMOTING_BASE_AUTO_THREAD_TASK_RUNNER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/callback.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "base/single_thread_task_runner.h"
     13 
     14 namespace remoting {
     15 
     16 // A wrapper around |SingleThreadTaskRunner| that provides automatic lifetime
     17 // management, by posting a caller-supplied task to the underlying task runner
     18 // when no more references remain.
     19 class AutoThreadTaskRunner : public base::SingleThreadTaskRunner {
     20  public:
     21   // Constructs an instance of |AutoThreadTaskRunner| wrapping |task_runner|.
     22   // |stop_task| is posted to |task_runner| when the last reference to
     23   // the AutoThreadTaskRunner is dropped.
     24   AutoThreadTaskRunner(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     25                        const base::Closure& stop_task);
     26 
     27   // SingleThreadTaskRunner implementation
     28   virtual bool PostDelayedTask(
     29       const tracked_objects::Location& from_here,
     30       const base::Closure& task,
     31       base::TimeDelta delay) OVERRIDE;
     32   virtual bool PostNonNestableDelayedTask(
     33       const tracked_objects::Location& from_here,
     34       const base::Closure& task,
     35       base::TimeDelta delay) OVERRIDE;
     36   virtual bool RunsTasksOnCurrentThread() const OVERRIDE;
     37 
     38  private:
     39   virtual ~AutoThreadTaskRunner();
     40 
     41   // Task posted to |task_runner_| to notify the caller that it may be stopped.
     42   base::Closure stop_task_;
     43 
     44   // The wrapped task runner.
     45   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
     46 
     47   DISALLOW_COPY_AND_ASSIGN(AutoThreadTaskRunner);
     48 };
     49 
     50 }  // namespace remoting
     51 
     52 #endif  // REMOTING_BASE_AUTO_THREAD_TASK_RUNNER_H_
     53