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.
5 #ifndef MEDIA_BASE_SERIAL_RUNNER_H_
6 #define MEDIA_BASE_SERIAL_RUNNER_H_
10 #include "base/callback.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "media/base/media_export.h"
15 #include "media/base/pipeline_status.h"
18 class SingleThreadTaskRunner
;
23 // Runs a series of bound functions accepting Closures or PipelineStatusCB.
24 // SerialRunner doesn't use regular Closure/PipelineStatusCBs as it late binds
25 // the completion callback as the series progresses.
26 class MEDIA_EXPORT SerialRunner
{
28 typedef base::Callback
<void(const base::Closure
&)> BoundClosure
;
29 typedef base::Callback
<void(const PipelineStatusCB
&)> BoundPipelineStatusCB
;
31 // Serial queue of bound functions to run.
32 class MEDIA_EXPORT Queue
{
37 void Push(const base::Closure
& closure
);
38 void Push(const BoundClosure
& bound_fn
);
39 void Push(const BoundPipelineStatusCB
& bound_fn
);
42 friend class SerialRunner
;
44 BoundPipelineStatusCB
Pop();
47 std::queue
<BoundPipelineStatusCB
> bound_fns_
;
50 // Executes the bound functions in series, executing |done_cb| when finished.
52 // All bound functions are executed on the thread that Run() is called on,
53 // including |done_cb|.
55 // To eliminate an unnecessary posted task, the first function is executed
56 // immediately on the caller's stack. It is *strongly advised* to ensure
57 // the calling code does no more work after the call to Run().
59 // In all cases, |done_cb| is guaranteed to execute on a separate calling
62 // Deleting the object will prevent execution of any unstarted bound
63 // functions, including |done_cb|.
64 static scoped_ptr
<SerialRunner
> Run(
65 const Queue
& bound_fns
, const PipelineStatusCB
& done_cb
);
68 friend struct base::DefaultDeleter
<SerialRunner
>;
70 SerialRunner(const Queue
& bound_fns
, const PipelineStatusCB
& done_cb
);
73 void RunNextInSeries(PipelineStatus last_status
);
75 scoped_refptr
<base::SingleThreadTaskRunner
> task_runner_
;
77 PipelineStatusCB done_cb_
;
79 // NOTE: Weak pointers must be invalidated before all other member variables.
80 base::WeakPtrFactory
<SerialRunner
> weak_factory_
;
82 DISALLOW_COPY_AND_ASSIGN(SerialRunner
);
87 #endif // MEDIA_BASE_SERIAL_RUNNER_H_