Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Unified Diff: services/media/framework/util/incident.h

Issue 2024953003: Motown: Move framework/util/incident* so other services can use it (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/media/framework/util/incident.h
diff --git a/services/media/framework/util/incident.h b/services/media/framework/util/incident.h
deleted file mode 100644
index 378a58ffe47e7b63728796085caee09a9687644f..0000000000000000000000000000000000000000
--- a/services/media/framework/util/incident.h
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2016 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 MOJO_SERVICES_MEDIA_FRAMEWORK_UTIL_INCIDENT_H_
-#define MOJO_SERVICES_MEDIA_FRAMEWORK_UTIL_INCIDENT_H_
-
-#include <functional>
-#include <vector>
-
-#include "base/synchronization/lock.h"
-
-namespace mojo {
-namespace media {
-
-// The Incident class provides a facility for executing code as the consequence
-// of some occurrence. This can be useful for building state machines and
-// otherwise dealing with asynchronous operations.
-//
-// Incident is not a thread-safe class and has no ability to make a thread wait
-// or to execute code on a particular thread.
-//
-// Incidents rely heavily on std::function, so they shouldn't be used in
-// enormous numbers.
-//
-// An Incident can be in one of two states: initial state or occurred state.
-//
-// Code can be executed when an incident occurs:
-//
-// incident.When([]() {
-// // Do something...
-// });
-//
-// The behavior of the When method depends on the incident's state. In initial
-// state, the consequence is added to a list to be executed when the incident
-// occurs. In occurred state, When executes the consequence immediately (before
-// When returns).
-//
-// An Incident occurs when its Occur (or Run) method is invoked and the Incident
-// is in the initial state. All registered consequences of the Incident are
-// executed during the call to Occur in the order they were added. Subsequent
-// calls to Occur are ignored until the Incident is reset.
-//
-// The Reset method ensures that the Incident is in its initial state and that
-// the list of consequences is cleared (without running the consequences).
-class Incident {
- public:
- Incident();
-
- ~Incident();
-
- // Determines if this Incident has occurred due to a past call to Occur.
- bool occurred() { return occurred_; }
-
- // Executes the consequence when this Incident occurs. If this Incident hasn't
- // occurred when this method is called, a copy of the consequence is held
- // until this Incident occurs or is reset. If this Incident has occurred when
- // this method is called, the consequence is executed immediately and no copy
- // of the consequence is held.
- void When(const std::function<void()>& consequence) {
- if (occurred_) {
- consequence();
- } else {
- consequences_.push_back(consequence);
- }
- }
-
- // If this Incident is in inital state (!occurred()), this method makes this
- // Incident occur, executing and deleting all its consequences. Otherwise,
- // does nothing.
- void Occur();
-
- // Resets this Incident to initial state and clears the list of consequences.
- void Reset() {
- occurred_ = false;
- consequences_.clear();
- }
-
- // Calls Occur. This method makes an Incident convertible to
- // mojo::Callback<void()>.
- void Run() { Occur(); }
-
- private:
- bool occurred_ = false;
- std::vector<std::function<void()>> consequences_;
-};
-
-// Like Incident, but threadsafe.
-class ThreadsafeIncident {
- public:
- ThreadsafeIncident();
-
- ~ThreadsafeIncident();
-
- // Determines if this ThreadsafeIncident has occurred due to a past call to
- // Occur. Note that the state of the this ThreadsafeIncident may change
- // immediately after this method returns, so there's no guarantee that the
- // result is still valid.
- bool occurred() {
- base::AutoLock lock(consequences_lock_);
- return occurred_;
- }
-
- // Executes the consequence when this ThreadsafeIncident occurs. If this
- // ThreadsafeIncident hasn't occurred when this method is called, a copy of
- // the consequence is held until this ThreadsafeIncident occurs or is reset.
- // If this ThreadsafeIncident has occurred when this method is called, the
- // consequence is executed immediately and no copy of the consequence is held.
- // Note that this ThreadsafeIncident's internal lock is not held when the
- // consequence is called. It's therefore possible for this ThreadsafeIncident
- // to be reset between the time the decision is made to run the consequence
- // and when the consequence is actually run.
- void When(const std::function<void()>& consequence) {
- {
- base::AutoLock lock(consequences_lock_);
- if (!occurred_) {
- consequences_.push_back(consequence);
- return;
- }
- }
-
- consequence();
- }
-
- // If this ThreadsafeIncident is in inital state (!occurred()), this method
- // makes this ThreadsafeIncident occur, executing and deleting all its
- // consequences. Otherwise, does nothing.
- void Occur();
-
- // Resets this ThreadsafeIncident to initial state and clears the list of
- // consequences.
- void Reset() {
- base::AutoLock lock(consequences_lock_);
- occurred_ = false;
- consequences_.clear();
- }
-
- // Calls Occur. This method makes an ThreadsafeIncident convertible to
- // mojo::Callback<void()>.
- void Run() { Occur(); }
-
- private:
- mutable base::Lock consequences_lock_;
- bool occurred_ = false;
- std::vector<std::function<void()>> consequences_;
-};
-
-} // namespace media
-} // namespace mojo
-
-#endif // MOJO_SERVICES_MEDIA_FRAMEWORK_UTIL_INCIDENT_H_

Powered by Google App Engine
This is Rietveld 408576698