1// Copyright 2013 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 "nacl_io/pipe/pipe_node.h"
6
7#include <errno.h>
8#include <fcntl.h>
9#include <pthread.h>
10#include <string.h>
11
12#include "nacl_io/ioctl.h"
13#include "nacl_io/kernel_handle.h"
14#include "nacl_io/pipe/pipe_event_emitter.h"
15
16namespace {
17const size_t kDefaultPipeSize = 512 * 1024;
18}
19
20namespace nacl_io {
21
22PipeNode::PipeNode(Filesystem* fs)
23    : StreamNode(fs), pipe_(new PipeEventEmitter(kDefaultPipeSize)) {
24}
25
26PipeEventEmitter* PipeNode::GetEventEmitter() {
27  return pipe_.get();
28}
29
30Error PipeNode::Read(const HandleAttr& attr,
31                     void* buf,
32                     size_t count,
33                     int* out_bytes) {
34  int ms = attr.IsBlocking() ? read_timeout_ : 0;
35
36  EventListenerLock wait(GetEventEmitter());
37  Error err = wait.WaitOnEvent(POLLIN, ms);
38  if (err == ETIMEDOUT)
39    err = EWOULDBLOCK;
40  if (err)
41    return err;
42
43  return GetEventEmitter()->Read_Locked(static_cast<char*>(buf), count,
44                                        out_bytes);
45}
46
47Error PipeNode::Write(const HandleAttr& attr,
48                      const void* buf,
49                      size_t count,
50                      int* out_bytes) {
51  int ms = attr.IsBlocking() ? write_timeout_ : 0;
52
53  EventListenerLock wait(GetEventEmitter());
54  Error err = wait.WaitOnEvent(POLLOUT, ms);
55  if (err == ETIMEDOUT)
56    err = EWOULDBLOCK;
57  if (err)
58    return err;
59
60  return GetEventEmitter()->Write_Locked(static_cast<const char*>(buf),
61                                         count, out_bytes);
62}
63
64}  // namespace nacl_io
65