diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-01 20:34:03 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-01 20:34:03 +0000 |
commit | ec046afdcd99c4e99f66333670666a64010fa242 (patch) | |
tree | 57bff3e3f4b1f0fdc4b9605712b0357179f07b91 /net/base/network_change_notifier_mac.cc | |
parent | d9977d4420a190fad3bb269d6338a8696df0d20b (diff) | |
download | chromium_src-ec046afdcd99c4e99f66333670666a64010fa242.zip chromium_src-ec046afdcd99c4e99f66333670666a64010fa242.tar.gz chromium_src-ec046afdcd99c4e99f66333670666a64010fa242.tar.bz2 |
Stop NetworkChangeNotifierMac from calling a virtual function before the constructor finishes.
NetworkChangeNotifierMac was posting a task to a separate thread in its constructor. It's possible (although highly unlikely, but happens on buildbots) for the separate thread to start up and run the task (which invokes a virtual function) before the constructor completes (and, more importantly, the subtype's constructor initializes its vtable entries which are NULL / pure virtual in the base class).
The solution is to simply use a Delegate instead. The Delegate should have been fully constructed (and thus, will not have the vtable initialization race) before being passed into NetworkChangeWatcherMac's constructor. This also solves the stylistic issue of avoiding multiple inheritance, since NetworkConfigWatcherMac was not strictly an interface.
BUG=53138
Review URL: http://codereview.chromium.org/3344002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58230 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/network_change_notifier_mac.cc')
-rw-r--r-- | net/base/network_change_notifier_mac.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/base/network_change_notifier_mac.cc b/net/base/network_change_notifier_mac.cc index 4c46a99..d07a15c 100644 --- a/net/base/network_change_notifier_mac.cc +++ b/net/base/network_change_notifier_mac.cc @@ -9,10 +9,14 @@ namespace net { -NetworkChangeNotifierMac::NetworkChangeNotifierMac() {} +NetworkChangeNotifierMac::NetworkChangeNotifierMac() + : forwarder_(this), + config_watcher_(&forwarder_) {} +NetworkChangeNotifierMac::~NetworkChangeNotifierMac() {} void NetworkChangeNotifierMac::SetDynamicStoreNotificationKeys( SCDynamicStoreRef store) { + // Called on notifier thread. scoped_cftyperef<CFMutableArrayRef> notification_keys( CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks)); scoped_cftyperef<CFStringRef> key(SCDynamicStoreKeyCreateNetworkGlobalEntity( |