| // Copyright (c) 2012 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 "tools/android/forwarder2/pipe_notifier.h" | 
 |  | 
 | #include <fcntl.h> | 
 | #include <unistd.h> | 
 | #include <sys/socket.h> | 
 | #include <sys/types.h> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "base/posix/eintr_wrapper.h" | 
 |  | 
 | namespace forwarder2 { | 
 |  | 
 | PipeNotifier::PipeNotifier() { | 
 |   int pipe_fd[2]; | 
 |   int ret = pipe(pipe_fd); | 
 |   CHECK_EQ(0, ret); | 
 |   receiver_fd_ = pipe_fd[0]; | 
 |   sender_fd_ = pipe_fd[1]; | 
 |   fcntl(sender_fd_, F_SETFL, O_NONBLOCK); | 
 | } | 
 |  | 
 | PipeNotifier::~PipeNotifier() { | 
 |   close(receiver_fd_); | 
 |   close(sender_fd_); | 
 | } | 
 |  | 
 | bool PipeNotifier::Notify() { | 
 |   CHECK_NE(-1, sender_fd_); | 
 |   errno = 0; | 
 |   int ret = HANDLE_EINTR(write(sender_fd_, "1", 1)); | 
 |   if (ret < 0) { | 
 |     PLOG(ERROR) << "write"; | 
 |     return false; | 
 |   } | 
 |   return true; | 
 | } | 
 |  | 
 | void PipeNotifier::Reset() { | 
 |   char c; | 
 |   int ret = HANDLE_EINTR(read(receiver_fd_, &c, 1)); | 
 |   if (ret < 0) { | 
 |     PLOG(ERROR) << "read"; | 
 |     return; | 
 |   } | 
 |   DCHECK_EQ(1, ret); | 
 |   DCHECK_EQ('1', c); | 
 | } | 
 |  | 
 | }  // namespace forwarder |