| Index: base/files/file_path_watcher_linux.cc
|
| diff --git a/base/files/file_path_watcher_linux.cc b/base/files/file_path_watcher_linux.cc
|
| index 86c963c4fc60a20f3a4be1f79873cc6495d07cb6..e51b913ee6f7a9c2cc46ba7985b138f4864b867a 100644
|
| --- a/base/files/file_path_watcher_linux.cc
|
| +++ b/base/files/file_path_watcher_linux.cc
|
| @@ -152,76 +152,62 @@ class FilePathWatcherImpl : public FilePathWatcher::PlatformDelegate,
|
| DISALLOW_COPY_AND_ASSIGN(FilePathWatcherImpl);
|
| };
|
|
|
| -class InotifyReaderTask : public Task {
|
| - public:
|
| - InotifyReaderTask(InotifyReader* reader, int inotify_fd, int shutdown_fd)
|
| - : reader_(reader),
|
| - inotify_fd_(inotify_fd),
|
| - shutdown_fd_(shutdown_fd) {
|
| - // Make sure the file descriptors are good for use with select().
|
| - CHECK_LE(0, inotify_fd_);
|
| - CHECK_GT(FD_SETSIZE, inotify_fd_);
|
| - CHECK_LE(0, shutdown_fd_);
|
| - CHECK_GT(FD_SETSIZE, shutdown_fd_);
|
| - }
|
| -
|
| - virtual void Run() {
|
| - while (true) {
|
| - fd_set rfds;
|
| - FD_ZERO(&rfds);
|
| - FD_SET(inotify_fd_, &rfds);
|
| - FD_SET(shutdown_fd_, &rfds);
|
| -
|
| - // Wait until some inotify events are available.
|
| - int select_result =
|
| - HANDLE_EINTR(select(std::max(inotify_fd_, shutdown_fd_) + 1,
|
| - &rfds, NULL, NULL, NULL));
|
| - if (select_result < 0) {
|
| - DPLOG(WARNING) << "select failed";
|
| - return;
|
| - }
|
| +void InotifyReaderCallback(InotifyReader* reader, int inotify_fd,
|
| + int shutdown_fd) {
|
| + // Make sure the file descriptors are good for use with select().
|
| + CHECK_LE(0, inotify_fd);
|
| + CHECK_GT(FD_SETSIZE, inotify_fd);
|
| + CHECK_LE(0, shutdown_fd);
|
| + CHECK_GT(FD_SETSIZE, shutdown_fd);
|
| +
|
| + while (true) {
|
| + fd_set rfds;
|
| + FD_ZERO(&rfds);
|
| + FD_SET(inotify_fd, &rfds);
|
| + FD_SET(shutdown_fd, &rfds);
|
| +
|
| + // Wait until some inotify events are available.
|
| + int select_result =
|
| + HANDLE_EINTR(select(std::max(inotify_fd, shutdown_fd) + 1,
|
| + &rfds, NULL, NULL, NULL));
|
| + if (select_result < 0) {
|
| + DPLOG(WARNING) << "select failed";
|
| + return;
|
| + }
|
|
|
| - if (FD_ISSET(shutdown_fd_, &rfds))
|
| - return;
|
| + if (FD_ISSET(shutdown_fd, &rfds))
|
| + return;
|
|
|
| - // Adjust buffer size to current event queue size.
|
| - int buffer_size;
|
| - int ioctl_result = HANDLE_EINTR(ioctl(inotify_fd_, FIONREAD,
|
| - &buffer_size));
|
| + // Adjust buffer size to current event queue size.
|
| + int buffer_size;
|
| + int ioctl_result = HANDLE_EINTR(ioctl(inotify_fd, FIONREAD,
|
| + &buffer_size));
|
|
|
| - if (ioctl_result != 0) {
|
| - DPLOG(WARNING) << "ioctl failed";
|
| - return;
|
| - }
|
| + if (ioctl_result != 0) {
|
| + DPLOG(WARNING) << "ioctl failed";
|
| + return;
|
| + }
|
|
|
| - std::vector<char> buffer(buffer_size);
|
| + std::vector<char> buffer(buffer_size);
|
|
|
| - ssize_t bytes_read = HANDLE_EINTR(read(inotify_fd_, &buffer[0],
|
| - buffer_size));
|
| + ssize_t bytes_read = HANDLE_EINTR(read(inotify_fd, &buffer[0],
|
| + buffer_size));
|
|
|
| - if (bytes_read < 0) {
|
| - DPLOG(WARNING) << "read from inotify fd failed";
|
| - return;
|
| - }
|
| + if (bytes_read < 0) {
|
| + DPLOG(WARNING) << "read from inotify fd failed";
|
| + return;
|
| + }
|
|
|
| - ssize_t i = 0;
|
| - while (i < bytes_read) {
|
| - inotify_event* event = reinterpret_cast<inotify_event*>(&buffer[i]);
|
| - size_t event_size = sizeof(inotify_event) + event->len;
|
| - DCHECK(i + event_size <= static_cast<size_t>(bytes_read));
|
| - reader_->OnInotifyEvent(event);
|
| - i += event_size;
|
| - }
|
| + ssize_t i = 0;
|
| + while (i < bytes_read) {
|
| + inotify_event* event = reinterpret_cast<inotify_event*>(&buffer[i]);
|
| + size_t event_size = sizeof(inotify_event) + event->len;
|
| + DCHECK(i + event_size <= static_cast<size_t>(bytes_read));
|
| + reader->OnInotifyEvent(event);
|
| + i += event_size;
|
| }
|
| }
|
| -
|
| - private:
|
| - InotifyReader* reader_;
|
| - int inotify_fd_;
|
| - int shutdown_fd_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(InotifyReaderTask);
|
| -};
|
| +}
|
|
|
| static base::LazyInstance<InotifyReader> g_inotify_reader =
|
| LAZY_INSTANCE_INITIALIZER;
|
| @@ -234,7 +220,8 @@ InotifyReader::InotifyReader()
|
| shutdown_pipe_[1] = -1;
|
| if (inotify_fd_ >= 0 && pipe(shutdown_pipe_) == 0 && thread_.Start()) {
|
| thread_.message_loop()->PostTask(
|
| - FROM_HERE, new InotifyReaderTask(this, inotify_fd_, shutdown_pipe_[0]));
|
| + FROM_HERE, base::Bind(&InotifyReaderCallback, this, inotify_fd_,
|
| + shutdown_pipe_[0]));
|
| valid_ = true;
|
| }
|
| }
|
|
|