| // Copyright (c) 2018 The Chromium Embedded Framework 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 CEF_TESTS_CEFCLIENT_BROWSER_UTIL_GTK_H_ |
| #define CEF_TESTS_CEFCLIENT_BROWSER_UTIL_GTK_H_ |
| #pragma once |
| |
| #include "include/base/cef_macros.h" |
| #include "include/base/cef_platform_thread.h" |
| |
| namespace client { |
| |
| // Scoped helper that manages the global GDK lock by calling gdk_threads_enter() |
| // and gdk_threads_leave(). The lock is not reentrant so this helper implements |
| // additional checking to avoid deadlocks. |
| // |
| // When using GTK in multi-threaded mode you must do the following: |
| // 1. Call gdk_threads_init() before making any other GTK/GDK/GLib calls. |
| // 2. Acquire the global lock before making any GTK/GDK calls, and release the |
| // lock afterwards. This should only be done with callbacks that do not |
| // originate from GTK signals (because those callbacks already hold the |
| // lock). |
| // |
| // See https://www.geany.org/manual/gtk/gtk-faq/x482.html for more information. |
| class ScopedGdkThreadsEnter { |
| public: |
| ScopedGdkThreadsEnter(); |
| ~ScopedGdkThreadsEnter(); |
| |
| private: |
| bool take_lock_; |
| |
| static base::PlatformThreadId locked_thread_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedGdkThreadsEnter); |
| }; |
| |
| } // namespace client |
| |
| #endif // CEF_TESTS_CEFCLIENT_BROWSER_UTIL_GTK_H_ |