Home | History | Annotate | Download | only in forwarder2
      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
      3 // found in the LICENSE file.
      4 
      5 #include "tools/android/forwarder2/pipe_notifier.h"
      6 
      7 #include <fcntl.h>
      8 #include <unistd.h>
      9 #include <sys/socket.h>
     10 #include <sys/types.h>
     11 
     12 #include "base/logging.h"
     13 #include "base/posix/eintr_wrapper.h"
     14 #include "base/safe_strerror_posix.h"
     15 
     16 namespace forwarder2 {
     17 
     18 PipeNotifier::PipeNotifier() {
     19   int pipe_fd[2];
     20   int ret = pipe(pipe_fd);
     21   CHECK_EQ(0, ret);
     22   receiver_fd_ = pipe_fd[0];
     23   sender_fd_ = pipe_fd[1];
     24   fcntl(sender_fd_, F_SETFL, O_NONBLOCK);
     25 }
     26 
     27 PipeNotifier::~PipeNotifier() {
     28   close(receiver_fd_);
     29   close(sender_fd_);
     30 }
     31 
     32 bool PipeNotifier::Notify() {
     33   CHECK_NE(-1, sender_fd_);
     34   errno = 0;
     35   int ret = HANDLE_EINTR(write(sender_fd_, "1", 1));
     36   if (ret < 0) {
     37     PLOG(ERROR) << "write";
     38     return false;
     39   }
     40   return true;
     41 }
     42 
     43 void PipeNotifier::Reset() {
     44   char c;
     45   int ret = HANDLE_EINTR(read(receiver_fd_, &c, 1));
     46   if (ret < 0) {
     47     PLOG(ERROR) << "read";
     48     return;
     49   }
     50   DCHECK_EQ(1, ret);
     51   DCHECK_EQ('1', c);
     52 }
     53 
     54 }  // namespace forwarder
     55