Index: base/critical_closure.h |
diff --git a/base/critical_closure.h b/base/critical_closure.h |
index ca51ed5cef27d40923ba8e4d99de4044c63fa457..a3f969496492d1881acdc2a87d0466870e766e2f 100644 |
--- a/base/critical_closure.h |
+++ b/base/critical_closure.h |
@@ -7,9 +7,45 @@ |
#include "base/callback.h" |
+#if defined(OS_IOS) |
+#import <UIKit/UIKit.h> |
Nico
2014/05/06 03:00:10
wot, why do you need UIKit in base?
That's why th
gab
2014/05/06 14:40:35
Oh of course, moved that as-is from the .mm file;
|
+ |
+#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) |
+// 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() {} |
+ |
+ void Run() { |
+ 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 +59,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([[UIDevice currentDevice] isMultitaskingSupported]); |
+ return base::Bind(&internals::CriticalClosure<R>::Run, |
+ Owned(new internals::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 |