| Index: base/critical_closure.h
|
| diff --git a/base/critical_closure.h b/base/critical_closure.h
|
| index ca51ed5cef27d40923ba8e4d99de4044c63fa457..ac07911089d3226a60a45367222f7165c143ec97 100644
|
| --- a/base/critical_closure.h
|
| +++ b/base/critical_closure.h
|
| @@ -7,9 +7,46 @@
|
|
|
| #include "base/callback.h"
|
|
|
| +#if defined(OS_IOS)
|
| +#include "base/bind.h"
|
| +#include "base/ios/scoped_critical_action.h"
|
| +#endif
|
| +
|
| namespace base {
|
|
|
| -// Returns a closure that will continue to run for a period of time when the
|
| +namespace internal {
|
| +
|
| +#if defined(OS_IOS)
|
| +// Returns true if multi-tasking is supported on this iOS device.
|
| +bool IsMultiTaskingSupported();
|
| +
|
| +// This class wraps a closure so it can continue to run for a period of time
|
| +// when the application goes to the background by using
|
| +// |ios::ScopedCriticalAction|.
|
| +template <typename R>
|
| +class CriticalClosure {
|
| + public:
|
| + explicit CriticalClosure(const Callback<R(void)>& closure)
|
| + : closure_(closure) {}
|
| +
|
| + ~CriticalClosure() {}
|
| +
|
| + R Run() {
|
| + return closure_.Run();
|
| + }
|
| +
|
| + private:
|
| + ios::ScopedCriticalAction critical_action_;
|
| + Callback<R(void)> closure_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CriticalClosure);
|
| +};
|
| +#endif // defined(OS_IOS)
|
| +
|
| +} // namespace internal
|
| +
|
| +// Returns a closure (which may return a result, but must not require any extra
|
| +// arguments) that will continue to run for a period of time when the
|
| // application goes to the background if possible on platforms where
|
| // applications don't execute while backgrounded, otherwise the original task is
|
| // returned.
|
| @@ -23,14 +60,20 @@ namespace base {
|
| // background running time, |MakeCriticalClosure| should be applied on them
|
| // before posting.
|
| #if defined(OS_IOS)
|
| -base::Closure MakeCriticalClosure(const base::Closure& closure);
|
| -#else
|
| -inline base::Closure MakeCriticalClosure(const base::Closure& closure) {
|
| +template <typename R>
|
| +Callback<R(void)> MakeCriticalClosure(const Callback<R(void)>& closure) {
|
| + DCHECK(internal::IsMultiTaskingSupported());
|
| + return base::Bind(&internal::CriticalClosure<R>::Run,
|
| + Owned(new internal::CriticalClosure<R>(closure)));
|
| +}
|
| +#else // defined(OS_IOS)
|
| +template <typename R>
|
| +inline Callback<R(void)> MakeCriticalClosure(const Callback<R(void)>& closure) {
|
| // No-op for platforms where the application does not need to acquire
|
| // background time for closures to finish when it goes into the background.
|
| return closure;
|
| }
|
| -#endif // !defined(OS_IOS)
|
| +#endif // defined(OS_IOS)
|
|
|
| } // namespace base
|
|
|
|
|