Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Side by Side Diff: net/base/network_change_notifier_linux.cc

Issue 10151009: Disallow UI/IO thread blocking on any other thread. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/file_stream_win.cc ('k') | net/disk_cache/backend_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // This implementation of NetworkChangeNotifier's offline state detection 5 // This implementation of NetworkChangeNotifier's offline state detection
6 // depends on D-Bus and NetworkManager, and is known to work on at least 6 // depends on D-Bus and NetworkManager, and is known to work on at least
7 // GNOME version 2.30. If D-Bus or NetworkManager are unavailable, this 7 // GNOME version 2.30. If D-Bus or NetworkManager are unavailable, this
8 // implementation will always behave as if it is online. 8 // implementation will always behave as if it is online.
9 9
10 #include "net/base/network_change_notifier_linux.h" 10 #include "net/base/network_change_notifier_linux.h"
11 11
12 #include <errno.h> 12 #include <errno.h>
13 #include <sys/socket.h> 13 #include <sys/socket.h>
14 14
15 #include "base/bind.h" 15 #include "base/bind.h"
16 #include "base/bind_helpers.h" 16 #include "base/bind_helpers.h"
17 #include "base/callback.h" 17 #include "base/callback.h"
18 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
19 #include "base/eintr_wrapper.h" 19 #include "base/eintr_wrapper.h"
20 #include "base/file_util.h" 20 #include "base/file_util.h"
21 #include "base/files/file_path_watcher.h" 21 #include "base/files/file_path_watcher.h"
22 #include "base/memory/weak_ptr.h" 22 #include "base/memory/weak_ptr.h"
23 #include "base/synchronization/lock.h" 23 #include "base/synchronization/lock.h"
24 #include "base/synchronization/waitable_event.h" 24 #include "base/synchronization/waitable_event.h"
25 #include "base/threading/platform_thread.h" 25 #include "base/threading/platform_thread.h"
26 #include "base/threading/thread.h" 26 #include "base/threading/thread.h"
27 #include "base/threading/thread_restrictions.h"
27 #include "dbus/bus.h" 28 #include "dbus/bus.h"
28 #include "dbus/message.h" 29 #include "dbus/message.h"
29 #include "dbus/object_proxy.h" 30 #include "dbus/object_proxy.h"
30 #include "net/base/net_errors.h" 31 #include "net/base/net_errors.h"
31 #include "net/base/network_change_notifier_netlink_linux.h" 32 #include "net/base/network_change_notifier_netlink_linux.h"
32 33
33 using ::base::files::FilePathWatcher; 34 using ::base::files::FilePathWatcher;
34 35
35 namespace net { 36 namespace net {
36 37
(...skipping 19 matching lines...) Expand all
56 NM_STATE_UNKNOWN = 0, 57 NM_STATE_UNKNOWN = 0,
57 NM_STATE_ASLEEP = 10, 58 NM_STATE_ASLEEP = 10,
58 NM_STATE_DISCONNECTED = 20, 59 NM_STATE_DISCONNECTED = 20,
59 NM_STATE_DISCONNECTING = 30, 60 NM_STATE_DISCONNECTING = 30,
60 NM_STATE_CONNECTING = 40, 61 NM_STATE_CONNECTING = 40,
61 NM_STATE_CONNECTED_LOCAL = 50, 62 NM_STATE_CONNECTED_LOCAL = 50,
62 NM_STATE_CONNECTED_SITE = 60, 63 NM_STATE_CONNECTED_SITE = 60,
63 NM_STATE_CONNECTED_GLOBAL = 70 64 NM_STATE_CONNECTED_GLOBAL = 70
64 }; 65 };
65 66
67 class DNSWatchDelegate : public FilePathWatcher::Delegate {
68 public:
69 explicit DNSWatchDelegate(const base::Closure& callback)
70 : callback_(callback) {}
71 virtual ~DNSWatchDelegate() {}
72 // FilePathWatcher::Delegate interface
73 virtual void OnFilePathChanged(const FilePath& path) OVERRIDE;
74 virtual void OnFilePathError(const FilePath& path) OVERRIDE;
75 private:
76 base::Closure callback_;
77 DISALLOW_COPY_AND_ASSIGN(DNSWatchDelegate);
78 };
79
80 void DNSWatchDelegate::OnFilePathChanged(const FilePath& path) {
81 // Calls NetworkChangeNotifier::NotifyObserversOfDNSChange().
82 callback_.Run();
83 }
84
85 void DNSWatchDelegate::OnFilePathError(const FilePath& path) {
86 LOG(ERROR) << "DNSWatchDelegate::OnFilePathError for " << path.value();
87 }
88
89 } // namespace
90
66 // A wrapper around NetworkManager's D-Bus API. 91 // A wrapper around NetworkManager's D-Bus API.
67 class NetworkManagerApi { 92 class NetworkManagerApi {
68 public: 93 public:
69 NetworkManagerApi(const base::Closure& notification_callback, dbus::Bus* bus) 94 NetworkManagerApi(const base::Closure& notification_callback, dbus::Bus* bus)
70 : is_offline_(false), 95 : is_offline_(false),
71 offline_state_initialized_(true /*manual_reset*/, false), 96 offline_state_initialized_(true /*manual_reset*/, false),
72 notification_callback_(notification_callback), 97 notification_callback_(notification_callback),
73 helper_thread_id_(base::kInvalidThreadId), 98 helper_thread_id_(base::kInvalidThreadId),
74 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)), 99 ALLOW_THIS_IN_INITIALIZER_LIST(ptr_factory_(this)),
75 system_bus_(bus) { } 100 system_bus_(bus) { }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 case NM_STATE_ASLEEP: 250 case NM_STATE_ASLEEP:
226 // Networking disabled or no devices on system 251 // Networking disabled or no devices on system
227 return true; 252 return true;
228 default: 253 default:
229 // Unknown status 254 // Unknown status
230 return false; 255 return false;
231 } 256 }
232 } 257 }
233 258
234 bool NetworkManagerApi::IsCurrentlyOffline() { 259 bool NetworkManagerApi::IsCurrentlyOffline() {
260 // http://crbug.com/125097
261 base::ThreadRestrictions::ScopedAllowWait allow_wait;
235 offline_state_initialized_.Wait(); 262 offline_state_initialized_.Wait();
236 base::AutoLock lock(is_offline_lock_); 263 base::AutoLock lock(is_offline_lock_);
237 return is_offline_; 264 return is_offline_;
238 } 265 }
239 266
240 class DNSWatchDelegate : public FilePathWatcher::Delegate {
241 public:
242 explicit DNSWatchDelegate(const base::Closure& callback)
243 : callback_(callback) {}
244 virtual ~DNSWatchDelegate() {}
245 // FilePathWatcher::Delegate interface
246 virtual void OnFilePathChanged(const FilePath& path) OVERRIDE;
247 virtual void OnFilePathError(const FilePath& path) OVERRIDE;
248 private:
249 base::Closure callback_;
250 DISALLOW_COPY_AND_ASSIGN(DNSWatchDelegate);
251 };
252
253 void DNSWatchDelegate::OnFilePathChanged(const FilePath& path) {
254 // Calls NetworkChangeNotifier::NotifyObserversOfDNSChange().
255 callback_.Run();
256 }
257
258 void DNSWatchDelegate::OnFilePathError(const FilePath& path) {
259 LOG(ERROR) << "DNSWatchDelegate::OnFilePathError for " << path.value();
260 }
261
262 } // namespace
263
264 class NetworkChangeNotifierLinux::Thread 267 class NetworkChangeNotifierLinux::Thread
265 : public base::Thread, public MessageLoopForIO::Watcher { 268 : public base::Thread, public MessageLoopForIO::Watcher {
266 public: 269 public:
267 explicit Thread(dbus::Bus* bus); 270 explicit Thread(dbus::Bus* bus);
268 virtual ~Thread(); 271 virtual ~Thread();
269 272
270 // MessageLoopForIO::Watcher: 273 // MessageLoopForIO::Watcher:
271 virtual void OnFileCanReadWithoutBlocking(int fd); 274 virtual void OnFileCanReadWithoutBlocking(int fd);
272 virtual void OnFileCanWriteWithoutBlocking(int /* fd */); 275 virtual void OnFileCanWriteWithoutBlocking(int /* fd */);
273 276
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 // Stopping from here allows us to sanity- check that the notifier 440 // Stopping from here allows us to sanity- check that the notifier
438 // thread shut down properly. 441 // thread shut down properly.
439 notifier_thread_->Stop(); 442 notifier_thread_->Stop();
440 } 443 }
441 444
442 bool NetworkChangeNotifierLinux::IsCurrentlyOffline() const { 445 bool NetworkChangeNotifierLinux::IsCurrentlyOffline() const {
443 return notifier_thread_->IsCurrentlyOffline(); 446 return notifier_thread_->IsCurrentlyOffline();
444 } 447 }
445 448
446 } // namespace net 449 } // namespace net
OLDNEW
« no previous file with comments | « net/base/file_stream_win.cc ('k') | net/disk_cache/backend_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698