Chromium Code Reviews| Index: base/win/message_window.cc |
| diff --git a/base/win/message_window.cc b/base/win/message_window.cc |
| index 26b64a533887e0e619d7b50a4d36f2de69d6303e..55ccd044906d0ea587a534b26d99ae62f870b8a5 100644 |
| --- a/base/win/message_window.cc |
| +++ b/base/win/message_window.cc |
| @@ -4,7 +4,7 @@ |
| #include "base/win/message_window.h" |
| -#include "base/lazy_instance.h" |
| +#include "base/at_exit.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/win/current_module.h" |
| @@ -15,8 +15,8 @@ const wchar_t kMessageWindowClassName[] = L"Chrome_MessageWindow"; |
| namespace base { |
| namespace win { |
| -// Used along with LazyInstance to register a window class for message-only |
| -// windows created by MessageWindow. |
| +// Used along with a threadsafe static pointer to register a window class for |
| +// message-only windows created by MessageWindow. |
| class MessageWindow::WindowClass { |
| public: |
| WindowClass(); |
| @@ -32,8 +32,17 @@ class MessageWindow::WindowClass { |
| DISALLOW_COPY_AND_ASSIGN(WindowClass); |
| }; |
| -static LazyInstance<MessageWindow::WindowClass> g_window_class = |
| - LAZY_INSTANCE_INITIALIZER; |
| +MessageWindow::WindowClass* GetWindowClass() { |
| + static MessageWindow::WindowClass* window_class = []() { |
| + auto ret = new MessageWindow::WindowClass(); |
| + auto deleter = [](void* p) { |
| + delete reinterpret_cast<MessageWindow::WindowClass*>(p); |
| + }; |
| + AtExitManager::RegisterCallback(deleter, ret); |
|
scottmg
2017/01/31 21:27:43
This "quick fix" is incorrect because in tests the
|
| + return ret; |
| + }(); |
| + return window_class; |
| +} |
| MessageWindow::WindowClass::WindowClass() |
| : atom_(0), instance_(CURRENT_MODULE()) { |
| @@ -104,9 +113,9 @@ bool MessageWindow::DoCreate(const MessageCallback& message_callback, |
| message_callback_ = message_callback; |
| - WindowClass& window_class = g_window_class.Get(); |
| - window_ = CreateWindow(MAKEINTATOM(window_class.atom()), window_name, 0, 0, 0, |
| - 0, 0, HWND_MESSAGE, 0, window_class.instance(), this); |
| + window_ = |
| + CreateWindow(MAKEINTATOM(GetWindowClass()->atom()), window_name, 0, 0, 0, |
| + 0, 0, HWND_MESSAGE, 0, GetWindowClass()->instance(), this); |
| if (!window_) { |
| PLOG(ERROR) << "Failed to create a message-only window"; |
| return false; |