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

Unified Diff: device/time_zone_monitor/time_zone_monitor_linux.cc

Issue 2690963002: [DeviceService] Move //device/time_zone_monitor to //services/device (Closed)
Patch Set: Enable device service to register JNI Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: device/time_zone_monitor/time_zone_monitor_linux.cc
diff --git a/device/time_zone_monitor/time_zone_monitor_linux.cc b/device/time_zone_monitor/time_zone_monitor_linux.cc
deleted file mode 100644
index 9aee0b2b4388fb1cdc3f202152528d500dbda93c..0000000000000000000000000000000000000000
--- a/device/time_zone_monitor/time_zone_monitor_linux.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "device/time_zone_monitor/time_zone_monitor.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/files/file_path_watcher.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
-#include "base/stl_util.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
-
-#if !defined(OS_CHROMEOS)
-
-namespace device {
-
-namespace {
-class TimeZoneMonitorLinuxImpl;
-} // namespace
-
-class TimeZoneMonitorLinux : public TimeZoneMonitor {
- public:
- TimeZoneMonitorLinux(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner);
- ~TimeZoneMonitorLinux() override;
-
- void NotifyClientsFromImpl() { NotifyClients(); }
-
- private:
- scoped_refptr<TimeZoneMonitorLinuxImpl> impl_;
-
- DISALLOW_COPY_AND_ASSIGN(TimeZoneMonitorLinux);
-};
-
-namespace {
-
-// FilePathWatcher needs to run on the FILE thread, but TimeZoneMonitor runs
-// on the UI thread. TimeZoneMonitorLinuxImpl is the bridge between these
-// threads.
-class TimeZoneMonitorLinuxImpl
- : public base::RefCountedThreadSafe<TimeZoneMonitorLinuxImpl> {
- public:
- explicit TimeZoneMonitorLinuxImpl(
- TimeZoneMonitorLinux* owner,
- scoped_refptr<base::SequencedTaskRunner> file_task_runner)
- : base::RefCountedThreadSafe<TimeZoneMonitorLinuxImpl>(),
- main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
- file_task_runner_(file_task_runner),
- owner_(owner) {
- DCHECK(main_task_runner_->RunsTasksOnCurrentThread());
- file_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&TimeZoneMonitorLinuxImpl::StartWatchingOnFileThread, this));
- }
-
- void StopWatching() {
- DCHECK(main_task_runner_->RunsTasksOnCurrentThread());
- owner_ = NULL;
- file_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&TimeZoneMonitorLinuxImpl::StopWatchingOnFileThread, this));
- }
-
- private:
- friend class base::RefCountedThreadSafe<TimeZoneMonitorLinuxImpl>;
-
- ~TimeZoneMonitorLinuxImpl() {
- DCHECK(!owner_);
- }
-
- void StartWatchingOnFileThread() {
- base::ThreadRestrictions::AssertIOAllowed();
- DCHECK(file_task_runner_->RunsTasksOnCurrentThread());
-
- // There is no true standard for where time zone information is actually
- // stored. glibc uses /etc/localtime, uClibc uses /etc/TZ, and some older
- // systems store the name of the time zone file within /usr/share/zoneinfo
- // in /etc/timezone. Different libraries and custom builds may mean that
- // still more paths are used. Just watch all three of these paths, because
- // false positives are harmless, assuming the false positive rate is
- // reasonable.
- const char* const kFilesToWatch[] = {
- "/etc/localtime", "/etc/timezone", "/etc/TZ",
- };
-
- for (size_t index = 0; index < arraysize(kFilesToWatch); ++index) {
- file_path_watchers_.push_back(base::MakeUnique<base::FilePathWatcher>());
- file_path_watchers_.back()->Watch(
- base::FilePath(kFilesToWatch[index]), false,
- base::Bind(&TimeZoneMonitorLinuxImpl::OnTimeZoneFileChanged, this));
- }
- }
-
- void StopWatchingOnFileThread() {
- DCHECK(file_task_runner_->RunsTasksOnCurrentThread());
- file_path_watchers_.clear();
- }
-
- void OnTimeZoneFileChanged(const base::FilePath& path, bool error) {
- DCHECK(file_task_runner_->RunsTasksOnCurrentThread());
- main_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&TimeZoneMonitorLinuxImpl::OnTimeZoneFileChangedOnUIThread,
- this));
- }
-
- void OnTimeZoneFileChangedOnUIThread() {
- DCHECK(main_task_runner_->RunsTasksOnCurrentThread());
- if (owner_) {
- owner_->NotifyClientsFromImpl();
- }
- }
-
- std::vector<std::unique_ptr<base::FilePathWatcher>> file_path_watchers_;
-
- scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
- scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
- TimeZoneMonitorLinux* owner_;
-
- DISALLOW_COPY_AND_ASSIGN(TimeZoneMonitorLinuxImpl);
-};
-
-} // namespace
-
-TimeZoneMonitorLinux::TimeZoneMonitorLinux(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner)
- : TimeZoneMonitor(), impl_() {
- // If the TZ environment variable is set, its value specifies the time zone
- // specification, and it's pointless to monitor any files in /etc for
- // changes because such changes would have no effect on the TZ environment
- // variable and thus the interpretation of the local time zone in the
- // or renderer processes.
- //
- // The system-specific format for the TZ environment variable beginning with
- // a colon is implemented by glibc as the path to a time zone data file, and
- // it would be possible to monitor this file for changes if a TZ variable of
- // this format was encountered, but this is not necessary: when loading a
- // time zone specification in this way, glibc does not reload the file when
- // it changes, so it's pointless to respond to a notification that it has
- // changed.
- if (!getenv("TZ")) {
- impl_ = new TimeZoneMonitorLinuxImpl(this, file_task_runner);
- }
-}
-
-TimeZoneMonitorLinux::~TimeZoneMonitorLinux() {
- if (impl_.get()) {
- impl_->StopWatching();
- }
-}
-
-// static
-std::unique_ptr<TimeZoneMonitor> TimeZoneMonitor::Create(
- scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
- return std::unique_ptr<TimeZoneMonitor>(
- new TimeZoneMonitorLinux(file_task_runner));
-}
-
-} // namespace device
-
-#endif // !OS_CHROMEOS
« no previous file with comments | « device/time_zone_monitor/time_zone_monitor_export.h ('k') | device/time_zone_monitor/time_zone_monitor_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698