Home | History | Annotate | Download | only in provider
      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 CHROME_BROWSER_ANDROID_PROVIDER_RUN_ON_UI_THREAD_BLOCKING_H_
      6 #define CHROME_BROWSER_ANDROID_PROVIDER_RUN_ON_UI_THREAD_BLOCKING_H_
      7 
      8 #include "base/bind.h"
      9 #include "base/callback.h"
     10 #include "base/synchronization/waitable_event.h"
     11 #include "content/public/browser/browser_thread.h"
     12 
     13 // Runs code synchronously on the UI thread. Should never be called directly
     14 // from the UI thread. To be used only within the provider classes.
     15 class RunOnUIThreadBlocking {
     16  public:
     17   // Runs the provided runnable in the UI thread synchronously.
     18   // The runnable argument can be defined using base::Bind.
     19   template <typename Signature>
     20   static void Run(base::Callback<Signature> runnable) {
     21     DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     22     base::WaitableEvent finished(false, false);
     23     content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
     24           base::Bind(&RunOnUIThreadBlocking::RunOnUIThread<Signature>,
     25                      runnable, &finished));
     26     finished.Wait();
     27   }
     28 
     29  private:
     30   template <typename Signature>
     31   static void RunOnUIThread(base::Callback<Signature> runnable,
     32                             base::WaitableEvent* finished) {
     33     DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     34     runnable.Run();
     35     finished->Signal();
     36   }
     37 };
     38 
     39 #endif  // CHROME_BROWSER_ANDROID_PROVIDER_RUN_ON_UI_THREAD_BLOCKING_H_
     40