diff options
author | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-31 21:06:26 +0000 |
---|---|---|
committer | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-31 21:06:26 +0000 |
commit | 18c1dbb1e68b980fd62a817764fc800a8f6ced42 (patch) | |
tree | 1094465c98ba9ab3835e3fa92ff23930afb944cd /remoting/base | |
parent | f53465f9cdb624155f8e5441396da9c8c427c1c1 (diff) | |
download | chromium_src-18c1dbb1e68b980fd62a817764fc800a8f6ced42.zip chromium_src-18c1dbb1e68b980fd62a817764fc800a8f6ced42.tar.gz chromium_src-18c1dbb1e68b980fd62a817764fc800a8f6ced42.tar.bz2 |
Introducing remoting::Stoppable helper base class implementing asynchronous shutdown on a specific thread.
Review URL: https://chromiumcodereview.appspot.com/10796099
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149273 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/base')
-rw-r--r-- | remoting/base/stoppable.cc | 41 | ||||
-rw-r--r-- | remoting/base/stoppable.h | 63 |
2 files changed, 104 insertions, 0 deletions
diff --git a/remoting/base/stoppable.cc b/remoting/base/stoppable.cc new file mode 100644 index 0000000..88b3c95 --- /dev/null +++ b/remoting/base/stoppable.cc @@ -0,0 +1,41 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "remoting/base/stoppable.h" + +#include "base/message_loop.h" +#include "base/single_thread_task_runner.h" + +namespace remoting { + +Stoppable::Stoppable( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::Closure& stopped_callback) + : state_(kRunning), + stopped_callback_(stopped_callback), + task_runner_(task_runner) { +} + +Stoppable::~Stoppable() { + DCHECK_EQ(state_, kStopped); +} + +void Stoppable::Stop() { + DCHECK(task_runner_->BelongsToCurrentThread()); + + if (state_ == kRunning) { + state_ = kStopping; + DoStop(); + } +} + +void Stoppable::CompleteStopping() { + DCHECK(task_runner_->BelongsToCurrentThread()); + DCHECK_EQ(state_, kStopping); + + state_ = kStopped; + task_runner_->PostTask(FROM_HERE, stopped_callback_); +} + +} // namespace remoting diff --git a/remoting/base/stoppable.h b/remoting/base/stoppable.h new file mode 100644 index 0000000..4d58a59 --- /dev/null +++ b/remoting/base/stoppable.h @@ -0,0 +1,63 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_BASE_STOPPABLE_H_ +#define REMOTING_BASE_STOPPABLE_H_ + +#include "base/basictypes.h" +#include "base/callback.h" +#include "base/memory/ref_counted.h" + +namespace base { +class SingleThreadTaskRunner; +} // namespace base + +namespace remoting { + +// A helper base class that implements asynchronous shutdown on a specific +// thread. +class Stoppable { + public: + // Constructs an object and stores the callback to be posted to |task_runner| + // once the object has been shutdown completely. + explicit Stoppable(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const base::Closure& stopped_callback); + virtual ~Stoppable(); + + // Initiates shutdown. It can be called by both the owner of the object and + // the object itself resulting in the same shutdown sequence. + void Stop(); + + protected: + // Called by derived classes to notify about shutdown completion. Posts + // the completion task on |task_runner_| message loop. + void CompleteStopping(); + + // Derived classes have to override this method to implement the shutdown + // logic. + virtual void DoStop() = 0; + + enum State { + kRunning, + kStopping, + kStopped + }; + + State stoppable_state() const { return state_; } + + private: + State state_; + + // A callback to be called when shutdown is completed. + base::Closure stopped_callback_; + + // The target task runner where the shutdown notification will be posted. + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + DISALLOW_COPY_AND_ASSIGN(Stoppable); +}; + +} // namespace remoting + +#endif // REMOTING_BASE_STOPPABLE_H_ |