X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fpipe.cpp;h=0f206981f11c6d1e205d127d281655965559187e;hp=f52801cd834e550199a808ab99020adcac8d6a27;hb=651cfe05e867ffdef9028a831add3eca54d19d0d;hpb=a27ea413e861a30c61b29d77d58ea3d15a9de6a1 diff --git a/source/io/pipe.cpp b/source/io/pipe.cpp index f52801c..0f20698 100644 --- a/source/io/pipe.cpp +++ b/source/io/pipe.cpp @@ -1,9 +1,10 @@ #ifndef WIN32 #include #include +#include #endif #include -#include +#include #include "handle_private.h" #include "pipe.h" @@ -13,19 +14,21 @@ namespace Msp { namespace IO { Pipe::Pipe(): - reader(handle[0], 1024) + reader(read_handle, 1024) { + mode = M_RDWR; + #ifdef WIN32 string name = format("\\\\.\\pipe\\%u.%p", GetCurrentProcessId(), this); - *handle[0] = CreateNamedPipe(name.c_str(), PIPE_ACCESS_INBOUND|FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 1024, 1024, 0, 0); - if(!handle[0]) + *read_handle = CreateNamedPipe(name.c_str(), PIPE_ACCESS_INBOUND|FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 1024, 1024, 0, 0); + if(!read_handle) throw system_error("CreateNamedPipe"); - *handle[1] = CreateFile(name.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); - if(!handle[1]) + *write_handle = CreateFile(name.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); + if(!write_handle) { unsigned err = GetLastError(); - CloseHandle(*handle[0]); + CloseHandle(*read_handle); throw system_error(format("CreateFile(%s)", name), err); } #else @@ -33,26 +36,20 @@ Pipe::Pipe(): if(pipe(pipe_fd)==-1) throw system_error("pipe"); - *handle[0] = pipe_fd[0]; - *handle[1] = pipe_fd[1]; + *read_handle = pipe_fd[0]; + *write_handle = pipe_fd[1]; #endif set_events(P_INPUT); } Pipe::~Pipe() -{ - close(); -} - -void Pipe::close() { set_events(P_NONE); signal_flush_required.emit(); - sys_close(handle[0]); - sys_close(handle[1]); - signal_closed.emit(); + sys_close(read_handle); + sys_close(write_handle); } void Pipe::set_block(bool b) @@ -62,10 +59,10 @@ void Pipe::set_block(bool b) mode = (mode|M_NONBLOCK); #ifndef WIN32 - int flags = fcntl(*handle[0], F_GETFD); - fcntl(*handle[0], F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); - flags = fcntl(*handle[1], F_GETFD); - fcntl(*handle[1], F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); + int flags = fcntl(*read_handle, F_GETFD); + fcntl(*read_handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); + flags = fcntl(*write_handle, F_GETFD); + fcntl(*write_handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); #endif } @@ -74,7 +71,7 @@ unsigned Pipe::do_write(const char *buf, unsigned size) if(size==0) return 0; - return sys_write(handle[1], buf, size); + return sys_write(write_handle, buf, size); } unsigned Pipe::do_read(char *buf, unsigned size) @@ -83,15 +80,21 @@ unsigned Pipe::do_read(char *buf, unsigned size) return 0; unsigned ret = reader.read(buf, size); - if(ret==0) - { - eof_flag = true; - signal_end_of_file.emit(); - } + set_eof(); return ret; } +const Handle &Pipe::get_handle(Mode m) +{ + if(m==M_READ) + return read_handle; + else if(m==M_WRITE) + return write_handle; + else + throw invalid_argument("Pipe::get_handle"); +} + } // namespace IO } // namespace Msp