Home | History | Annotate | Download | only in pipe
      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 
     16 namespace {
     17 const size_t kDefaultPipeSize = 512 * 1024;
     18 }
     19 
     20 namespace nacl_io {
     21 
     22 PipeNode::PipeNode(Filesystem* fs)
     23     : StreamNode(fs), pipe_(new PipeEventEmitter(kDefaultPipeSize)) {
     24 }
     25 
     26 PipeEventEmitter* PipeNode::GetEventEmitter() {
     27   return pipe_.get();
     28 }
     29 
     30 Error 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 
     47 Error 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