Chromium Code Reviews| Index: chrome/browser/android/run_on_ui_thread_blocking.h |
| diff --git a/chrome/browser/android/run_on_ui_thread_blocking.h b/chrome/browser/android/run_on_ui_thread_blocking.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9c8bdb9dc8733d4386bd8220df93b4a307be6d4d |
| --- /dev/null |
| +++ b/chrome/browser/android/run_on_ui_thread_blocking.h |
| @@ -0,0 +1,39 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef CHROME_BROWSER_ANDROID_RUN_ON_UI_THREAD_BLOCKING_H_ |
| +#define CHROME_BROWSER_ANDROID_RUN_ON_UI_THREAD_BLOCKING_H_ |
| + |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| +#include "base/synchronization/waitable_event.h" |
| +#include "content/public/browser/browser_thread.h" |
| + |
| +// Runs code synchronously on the UI thread. Should never be called directly |
| +// from the UI thread. |
| +class RunOnUIThreadBlocking { |
|
Yaron
2012/09/10 19:30:04
Hmm. This seems like a generally dangerous class,
Leandro Gracia Gil
2012/09/10 22:21:48
Moving the provider code to a subfolder and adding
|
| + public: |
| + // Runs the provided runnable in the UI thread synchronously. |
| + // The runnable argument can be defined using base::Bind. |
| + template <typename Signature> |
| + static void Run(base::Callback<Signature> runnable) { |
| + DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + base::WaitableEvent finished(false, false); |
| + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
| + base::Bind(&RunOnUIThreadBlocking::RunOnUIThread<Signature>, |
| + runnable, &finished)); |
| + finished.Wait(); |
| + } |
| + |
| + private: |
| + template <typename Signature> |
| + static void RunOnUIThread(base::Callback<Signature> runnable, |
| + base::WaitableEvent* finished) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + runnable.Run(); |
| + finished->Signal(); |
| + } |
| +}; |
| + |
| +#endif // CHROME_BROWSER_ANDROID_RUN_ON_UI_THREAD_BLOCKING_H_ |