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