• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
PipeNotifier()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 
~PipeNotifier()27 PipeNotifier::~PipeNotifier() {
28   close(receiver_fd_);
29   close(sender_fd_);
30 }
31 
Notify()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 
Reset()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