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 MessageLoopProxy
;
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 BoundClosure
& bound_fn
);
38 void Push(const BoundPipelineStatusCB
& bound_fn
);
41 friend class SerialRunner
;
43 BoundPipelineStatusCB
Pop();
46 std::queue
<BoundPipelineStatusCB
> bound_fns_
;
49 // Executes the bound functions in series, executing |done_cb| when finished.
51 // All bound functions are executed on the thread that Run() is called on,
52 // including |done_cb|.
54 // To eliminate an unnecessary posted task, the first function is executed
55 // immediately on the caller's stack. It is *strongly advised* to ensure
56 // the calling code does no more work after the call to Run().
58 // In all cases, |done_cb| is guaranteed to execute on a separate calling
61 // Deleting the object will prevent execution of any unstarted bound
62 // functions, including |done_cb|.
63 static scoped_ptr
<SerialRunner
> Run(
64 const Queue
& bound_fns
, const PipelineStatusCB
& done_cb
);
67 friend struct base::DefaultDeleter
<SerialRunner
>;
69 SerialRunner(const Queue
& bound_fns
, const PipelineStatusCB
& done_cb
);
72 void RunNextInSeries(PipelineStatus last_status
);
74 base::WeakPtrFactory
<SerialRunner
> weak_this_
;
75 scoped_refptr
<base::MessageLoopProxy
> message_loop_
;
77 PipelineStatusCB done_cb_
;
79 DISALLOW_COPY_AND_ASSIGN(SerialRunner
);
84 #endif // MEDIA_BASE_SERIAL_RUNNER_H_