| Index: base/message_loop/message_pump_win.cc
|
| diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc
|
| index 53df341e5fce09a65ed087837db2bacc2aa7b8f6..04bc3ceab2b8009e48708a16a308b5195bf27c10 100644
|
| --- a/base/message_loop/message_pump_win.cc
|
| +++ b/base/message_loop/message_pump_win.cc
|
| @@ -28,6 +28,85 @@ enum MessageLoopProblems {
|
| MESSAGE_LOOP_PROBLEM_MAX,
|
| };
|
|
|
| +// The following define pointers to user32 API's for the API's which are used
|
| +// in this file. These are added to avoid directly depending on user32 from
|
| +// base as there are users of base who don't want this.
|
| +decltype(::TranslateMessage)* g_translate_message = nullptr;
|
| +decltype(::DispatchMessageW)* g_dispatch_message = nullptr;
|
| +decltype(::PeekMessageW)* g_peek_message = nullptr;
|
| +decltype(::PostMessageW)* g_post_message = nullptr;
|
| +decltype(::DefWindowProcW)* g_def_window_proc = nullptr;
|
| +decltype(::PostQuitMessage)* g_post_quit = nullptr;
|
| +decltype(::UnregisterClassW)* g_unregister_class = nullptr;
|
| +decltype(::RegisterClassExW)* g_register_class = nullptr;
|
| +decltype(::CreateWindowExW)* g_create_window_ex = nullptr;
|
| +decltype(::DestroyWindow)* g_destroy_window = nullptr;
|
| +decltype(::CallMsgFilterW)* g_call_msg_filter = nullptr;
|
| +decltype(::GetQueueStatus)* g_get_queue_status = nullptr;
|
| +decltype(::MsgWaitForMultipleObjectsEx)* g_msg_wait_for_multiple_objects_ex =
|
| + nullptr;
|
| +decltype(::SetTimer)* g_set_timer = nullptr;
|
| +decltype(::KillTimer)* g_kill_timer = nullptr;
|
| +
|
| +#define GET_USER32_API(module, name) \
|
| + reinterpret_cast<decltype(name)*>(::GetProcAddress(module, #name))
|
| +
|
| +// Initializes the global pointers to user32 APIs for the API's used in this
|
| +// file.
|
| +void InitUser32APIs() {
|
| + if (g_translate_message)
|
| + return;
|
| +
|
| + HMODULE user32_module = ::GetModuleHandle(L"user32.dll");
|
| + CHECK(user32_module);
|
| +
|
| + g_translate_message = GET_USER32_API(user32_module, TranslateMessage);
|
| + CHECK(g_translate_message);
|
| +
|
| + g_dispatch_message = GET_USER32_API(user32_module, DispatchMessageW);
|
| + CHECK(g_dispatch_message);
|
| +
|
| + g_peek_message = GET_USER32_API(user32_module, PeekMessageW);
|
| + CHECK(g_peek_message);
|
| +
|
| + g_post_message = GET_USER32_API(user32_module, PostMessageW);
|
| + CHECK(g_post_message);
|
| +
|
| + g_def_window_proc = GET_USER32_API(user32_module, DefWindowProcW);
|
| + CHECK(g_def_window_proc);
|
| +
|
| + g_post_quit = GET_USER32_API(user32_module, PostQuitMessage);
|
| + CHECK(g_post_quit);
|
| +
|
| + g_unregister_class = GET_USER32_API(user32_module, UnregisterClassW);
|
| + CHECK(g_unregister_class);
|
| +
|
| + g_register_class = GET_USER32_API(user32_module, RegisterClassExW);
|
| + CHECK(g_register_class);
|
| +
|
| + g_create_window_ex = GET_USER32_API(user32_module, CreateWindowExW);
|
| + CHECK(g_create_window_ex);
|
| +
|
| + g_destroy_window = GET_USER32_API(user32_module, DestroyWindow);
|
| + CHECK(g_destroy_window);
|
| +
|
| + g_call_msg_filter = GET_USER32_API(user32_module, CallMsgFilterW);
|
| + CHECK(g_call_msg_filter);
|
| +
|
| + g_get_queue_status = GET_USER32_API(user32_module, GetQueueStatus);
|
| + CHECK(g_get_queue_status);
|
| +
|
| + g_msg_wait_for_multiple_objects_ex =
|
| + GET_USER32_API(user32_module, MsgWaitForMultipleObjectsEx);
|
| + CHECK(g_msg_wait_for_multiple_objects_ex);
|
| +
|
| + g_set_timer = GET_USER32_API(user32_module, SetTimer);
|
| + CHECK(g_set_timer);
|
| +
|
| + g_kill_timer = GET_USER32_API(user32_module, KillTimer);
|
| + CHECK(g_kill_timer);
|
| +}
|
| +
|
| } // namespace
|
|
|
| static const wchar_t kWndClassFormat[] = L"Chrome_MessagePumpWindow_%p";
|
| @@ -42,6 +121,10 @@ static const int kMessageFilterCode = 0x5001;
|
| //-----------------------------------------------------------------------------
|
| // MessagePumpWin public:
|
|
|
| +MessagePumpWin::MessagePumpWin() {
|
| + InitUser32APIs();
|
| +}
|
| +
|
| void MessagePumpWin::Run(Delegate* delegate) {
|
| RunState s;
|
| s.delegate = delegate;
|
| @@ -96,8 +179,8 @@ MessagePumpForUI::MessagePumpForUI()
|
| }
|
|
|
| MessagePumpForUI::~MessagePumpForUI() {
|
| - DestroyWindow(message_hwnd_);
|
| - UnregisterClass(MAKEINTATOM(atom_), CURRENT_MODULE());
|
| + g_destroy_window(message_hwnd_);
|
| + g_unregister_class(MAKEINTATOM(atom_), CURRENT_MODULE());
|
| }
|
|
|
| void MessagePumpForUI::ScheduleWork() {
|
| @@ -105,8 +188,8 @@ void MessagePumpForUI::ScheduleWork() {
|
| return; // Someone else continued the pumping.
|
|
|
| // Make sure the MessagePump does some work for us.
|
| - BOOL ret = PostMessage(message_hwnd_, kMsgHaveWork,
|
| - reinterpret_cast<WPARAM>(this), 0);
|
| + BOOL ret = g_post_message(message_hwnd_, kMsgHaveWork,
|
| + reinterpret_cast<WPARAM>(this), 0);
|
| if (ret)
|
| return; // There was room in the Window Message queue.
|
|
|
| @@ -146,7 +229,7 @@ LRESULT CALLBACK MessagePumpForUI::WndProcThunk(
|
| reinterpret_cast<MessagePumpForUI*>(wparam)->HandleTimerMessage();
|
| break;
|
| }
|
| - return DefWindowProc(hwnd, message, wparam, lparam);
|
| + return g_def_window_proc(hwnd, message, wparam, lparam);
|
| }
|
|
|
| void MessagePumpForUI::DoRunLoop() {
|
| @@ -187,7 +270,7 @@ void MessagePumpForUI::DoRunLoop() {
|
| // don't want to disturb that timer if it is already in flight. However,
|
| // if we did do all remaining delayed work, then lets kill the WM_TIMER.
|
| if (more_work_is_plausible && delayed_work_time_.is_null())
|
| - KillTimer(message_hwnd_, reinterpret_cast<UINT_PTR>(this));
|
| + g_kill_timer(message_hwnd_, reinterpret_cast<UINT_PTR>(this));
|
| if (state_->should_quit)
|
| break;
|
|
|
| @@ -215,11 +298,11 @@ void MessagePumpForUI::InitMessageWnd() {
|
| wc.lpfnWndProc = base::win::WrappedWindowProc<WndProcThunk>;
|
| wc.hInstance = instance;
|
| wc.lpszClassName = class_name.c_str();
|
| - atom_ = RegisterClassEx(&wc);
|
| + atom_ = g_register_class(&wc);
|
| DCHECK(atom_);
|
|
|
| - message_hwnd_ = CreateWindow(MAKEINTATOM(atom_), 0, 0, 0, 0, 0, 0,
|
| - HWND_MESSAGE, 0, instance, 0);
|
| + message_hwnd_ = g_create_window_ex(0, MAKEINTATOM(atom_), 0, 0, 0, 0, 0, 0,
|
| + HWND_MESSAGE, 0, instance, 0);
|
| DCHECK(message_hwnd_);
|
| }
|
|
|
| @@ -233,8 +316,8 @@ void MessagePumpForUI::WaitForWork() {
|
| if (delay < 0) // Negative value means no timers waiting.
|
| delay = INFINITE;
|
|
|
| - DWORD result =
|
| - MsgWaitForMultipleObjectsEx(0, NULL, delay, QS_ALLINPUT, wait_flags);
|
| + DWORD result = g_msg_wait_for_multiple_objects_ex(0, nullptr, delay,
|
| + QS_ALLINPUT, wait_flags);
|
|
|
| if (WAIT_OBJECT_0 == result) {
|
| // A WM_* message is available.
|
| @@ -252,9 +335,9 @@ void MessagePumpForUI::WaitForWork() {
|
| // current thread.
|
| MSG msg = {0};
|
| bool has_pending_sent_message =
|
| - (HIWORD(GetQueueStatus(QS_SENDMESSAGE)) & QS_SENDMESSAGE) != 0;
|
| + (HIWORD(g_get_queue_status(QS_SENDMESSAGE)) & QS_SENDMESSAGE) != 0;
|
| if (has_pending_sent_message ||
|
| - PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
|
| + g_peek_message(&msg, nullptr, 0, 0, PM_NOREMOVE)) {
|
| return;
|
| }
|
|
|
| @@ -292,7 +375,7 @@ void MessagePumpForUI::HandleWorkMessage() {
|
| }
|
|
|
| void MessagePumpForUI::HandleTimerMessage() {
|
| - KillTimer(message_hwnd_, reinterpret_cast<UINT_PTR>(this));
|
| + g_kill_timer(message_hwnd_, reinterpret_cast<UINT_PTR>(this));
|
|
|
| // If we are being called outside of the context of Run, then don't do
|
| // anything. This could correspond to a MessageBox call or something of
|
| @@ -337,8 +420,8 @@ void MessagePumpForUI::RescheduleTimer() {
|
|
|
| // Create a WM_TIMER event that will wake us up to check for any pending
|
| // timers (in case we are running within a nested, external sub-pump).
|
| - BOOL ret = SetTimer(message_hwnd_, reinterpret_cast<UINT_PTR>(this),
|
| - delay_msec, NULL);
|
| + BOOL ret = g_set_timer(message_hwnd_, reinterpret_cast<UINT_PTR>(this),
|
| + delay_msec, nullptr);
|
| if (ret)
|
| return;
|
| // If we can't set timers, we are in big trouble... but cross our fingers
|
| @@ -355,12 +438,12 @@ bool MessagePumpForUI::ProcessNextWindowsMessage() {
|
| // case to ensure that the message loop peeks again instead of calling
|
| // MsgWaitForMultipleObjectsEx again.
|
| bool sent_messages_in_queue = false;
|
| - DWORD queue_status = GetQueueStatus(QS_SENDMESSAGE);
|
| + DWORD queue_status = g_get_queue_status(QS_SENDMESSAGE);
|
| if (HIWORD(queue_status) & QS_SENDMESSAGE)
|
| sent_messages_in_queue = true;
|
|
|
| MSG msg;
|
| - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != FALSE)
|
| + if (g_peek_message(&msg, nullptr, 0, 0, PM_REMOVE) != FALSE)
|
| return ProcessMessageHelper(msg);
|
|
|
| return sent_messages_in_queue;
|
| @@ -373,7 +456,7 @@ bool MessagePumpForUI::ProcessMessageHelper(const MSG& msg) {
|
| // Repost the QUIT message so that it will be retrieved by the primary
|
| // GetMessage() loop.
|
| state_->should_quit = true;
|
| - PostQuitMessage(static_cast<int>(msg.wParam));
|
| + g_post_quit(static_cast<int>(msg.wParam));
|
| return false;
|
| }
|
|
|
| @@ -381,11 +464,11 @@ bool MessagePumpForUI::ProcessMessageHelper(const MSG& msg) {
|
| if (msg.message == kMsgHaveWork && msg.hwnd == message_hwnd_)
|
| return ProcessPumpReplacementMessage();
|
|
|
| - if (CallMsgFilter(const_cast<MSG*>(&msg), kMessageFilterCode))
|
| + if (g_call_msg_filter(const_cast<MSG*>(&msg), kMessageFilterCode))
|
| return true;
|
|
|
| - TranslateMessage(&msg);
|
| - DispatchMessage(&msg);
|
| + g_translate_message(&msg);
|
| + g_dispatch_message(&msg);
|
|
|
| return true;
|
| }
|
| @@ -401,7 +484,8 @@ bool MessagePumpForUI::ProcessPumpReplacementMessage() {
|
| // asynchronous to this thread!!
|
|
|
| MSG msg;
|
| - const bool have_message = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != FALSE;
|
| + const bool have_message =
|
| + g_peek_message(&msg, nullptr, 0, 0, PM_REMOVE) != FALSE;
|
|
|
| // Expect no message or a message different than kMsgHaveWork.
|
| DCHECK(!have_message || kMsgHaveWork != msg.message ||
|
| @@ -531,7 +615,7 @@ void MessagePumpForGpu::WaitForWork() {
|
| debug::Alias(&delay);
|
|
|
| DWORD result =
|
| - MsgWaitForMultipleObjectsEx(1, &event_, delay, QS_ALLINPUT, 0);
|
| + g_msg_wait_for_multiple_objects_ex(1, &event_, delay, QS_ALLINPUT, 0);
|
| DCHECK_NE(WAIT_FAILED, result) << GetLastError();
|
| if (result != WAIT_TIMEOUT) {
|
| // Either work or message available.
|
| @@ -542,20 +626,20 @@ void MessagePumpForGpu::WaitForWork() {
|
|
|
| bool MessagePumpForGpu::ProcessNextMessage() {
|
| MSG msg;
|
| - if (!PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
|
| + if (!g_peek_message(&msg, nullptr, 0, 0, PM_REMOVE))
|
| return false;
|
|
|
| if (msg.message == WM_QUIT) {
|
| // Repost the QUIT message so that it will be retrieved by the primary
|
| // GetMessage() loop.
|
| state_->should_quit = true;
|
| - PostQuitMessage(static_cast<int>(msg.wParam));
|
| + g_post_quit(static_cast<int>(msg.wParam));
|
| return false;
|
| }
|
|
|
| - if (!CallMsgFilter(const_cast<MSG*>(&msg), kMessageFilterCode)) {
|
| - TranslateMessage(&msg);
|
| - DispatchMessage(&msg);
|
| + if (!g_call_msg_filter(const_cast<MSG*>(&msg), kMessageFilterCode)) {
|
| + g_translate_message(&msg);
|
| + g_dispatch_message(&msg);
|
| }
|
|
|
| return true;
|
| @@ -569,7 +653,8 @@ MessagePumpForIO::IOContext::IOContext() {
|
| }
|
|
|
| MessagePumpForIO::MessagePumpForIO() {
|
| - port_.Set(CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1));
|
| + port_.Set(CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr,
|
| + reinterpret_cast<ULONG_PTR>(nullptr), 1));
|
| DCHECK(port_.IsValid());
|
| }
|
|
|
| @@ -637,7 +722,7 @@ void MessagePumpForIO::DoRunLoop() {
|
| if (state_->should_quit)
|
| break;
|
|
|
| - more_work_is_plausible |= WaitForIOCompletion(0, NULL);
|
| + more_work_is_plausible |= WaitForIOCompletion(0, nullptr);
|
| if (state_->should_quit)
|
| break;
|
|
|
| @@ -671,7 +756,7 @@ void MessagePumpForIO::WaitForWork() {
|
| if (timeout < 0) // Negative value means no timers waiting.
|
| timeout = INFINITE;
|
|
|
| - WaitForIOCompletion(timeout, NULL);
|
| + WaitForIOCompletion(timeout, nullptr);
|
| }
|
|
|
| bool MessagePumpForIO::WaitForIOCompletion(DWORD timeout, IOHandler* filter) {
|
| @@ -698,8 +783,8 @@ bool MessagePumpForIO::WaitForIOCompletion(DWORD timeout, IOHandler* filter) {
|
| // Asks the OS for another IO completion result.
|
| bool MessagePumpForIO::GetIOItem(DWORD timeout, IOItem* item) {
|
| memset(item, 0, sizeof(*item));
|
| - ULONG_PTR key = NULL;
|
| - OVERLAPPED* overlapped = NULL;
|
| + ULONG_PTR key = reinterpret_cast<ULONG_PTR>(nullptr);
|
| + OVERLAPPED* overlapped = nullptr;
|
| if (!GetQueuedCompletionStatus(port_.Get(), &item->bytes_transfered, &key,
|
| &overlapped, timeout)) {
|
| if (!overlapped)
|
|
|