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 16namespace forwarder2 { 17 18PipeNotifier::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 27PipeNotifier::~PipeNotifier() { 28 close(receiver_fd_); 29 close(sender_fd_); 30} 31 32bool 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 43void 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