[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 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 BASE_CRITICAL_CLOSURE_H_ | ||||
6 | #define BASE_CRITICAL_CLOSURE_H_ | ||||
7 | |||||
tzik | 070c8ffb | 2017-03-29 05:28:12 | [diff] [blame] | 8 | #include <utility> |
9 | |||||
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 10 | #include "base/callback.h" |
avi | 9b6f4293 | 2015-12-26 22:15:14 | [diff] [blame] | 11 | #include "base/macros.h" |
12 | #include "build/build_config.h" | ||||
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 13 | |
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 14 | #if defined(OS_IOS) |
15 | #include "base/bind.h" | ||||
16 | #include "base/ios/scoped_critical_action.h" | ||||
17 | #endif | ||||
18 | |||||
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 19 | namespace base { |
20 | |||||
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 21 | namespace internal { |
22 | |||||
23 | #if defined(OS_IOS) | ||||
24 | // Returns true if multi-tasking is supported on this iOS device. | ||||
25 | bool IsMultiTaskingSupported(); | ||||
26 | |||||
27 | // This class wraps a closure so it can continue to run for a period of time | ||||
28 | // when the application goes to the background by using | ||||
29 | // |ios::ScopedCriticalAction|. | ||||
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 30 | class CriticalClosure { |
31 | public: | ||||
tzik | 6e42784 | 2017-04-05 10:13:21 | [diff] [blame] | 32 | explicit CriticalClosure(OnceClosure closure); |
tzik | 796370e | 2017-01-26 10:07:56 | [diff] [blame] | 33 | ~CriticalClosure(); |
34 | void Run(); | ||||
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 35 | |
36 | private: | ||||
37 | ios::ScopedCriticalAction critical_action_; | ||||
tzik | 6e42784 | 2017-04-05 10:13:21 | [diff] [blame] | 38 | OnceClosure closure_; |
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 39 | |
40 | DISALLOW_COPY_AND_ASSIGN(CriticalClosure); | ||||
41 | }; | ||||
42 | #endif // defined(OS_IOS) | ||||
43 | |||||
44 | } // namespace internal | ||||
45 | |||||
tzik | 796370e | 2017-01-26 10:07:56 | [diff] [blame] | 46 | // Returns a closure that will continue to run for a period of time when the |
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 47 | // application goes to the background if possible on platforms where |
48 | // applications don't execute while backgrounded, otherwise the original task is | ||||
49 | // returned. | ||||
50 | // | ||||
51 | // Example: | ||||
skyostil | 054861d | 2015-04-30 19:06:15 | [diff] [blame] | 52 | // file_task_runner_->PostTask( |
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 53 | // FROM_HERE, |
54 | // MakeCriticalClosure(base::Bind(&WriteToDiskTask, path_, data))); | ||||
55 | // | ||||
56 | // Note new closures might be posted in this closure. If the new closures need | ||||
57 | // background running time, |MakeCriticalClosure| should be applied on them | ||||
58 | // before posting. | ||||
59 | #if defined(OS_IOS) | ||||
tzik | 6e42784 | 2017-04-05 10:13:21 | [diff] [blame] | 60 | inline OnceClosure MakeCriticalClosure(OnceClosure closure) { |
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 61 | DCHECK(internal::IsMultiTaskingSupported()); |
tzik | 6e42784 | 2017-04-05 10:13:21 | [diff] [blame] | 62 | return base::BindOnce( |
63 | &internal::CriticalClosure::Run, | ||||
64 | Owned(new internal::CriticalClosure(std::move(closure)))); | ||||
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 65 | } |
66 | #else // defined(OS_IOS) | ||||
tzik | 6e42784 | 2017-04-05 10:13:21 | [diff] [blame] | 67 | inline OnceClosure MakeCriticalClosure(OnceClosure closure) { |
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 68 | // No-op for platforms where the application does not need to acquire |
69 | // background time for closures to finish when it goes into the background. | ||||
70 | return closure; | ||||
71 | } | ||||
[email protected] | 16d3e3d | 2014-05-09 11:57:31 | [diff] [blame] | 72 | #endif // defined(OS_IOS) |
[email protected] | f0a6f4bb | 2012-08-01 15:42:16 | [diff] [blame] | 73 | |
74 | } // namespace base | ||||
75 | |||||
76 | #endif // BASE_CRITICAL_CLOSURE_H_ |