X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fwindows%2Feventreader.cpp;h=8c4102067854eb0c9096ff92ab4277c1e3cf6441;hp=8a4c862d3eb7a9d846af590322fffed6d73b1ccb;hb=03862ac4f38db0799872850dc4ab43b88688e4eb;hpb=a1de921567c0e45efa9cf1a8c9a947582a667796 diff --git a/source/io/windows/eventreader.cpp b/source/io/windows/eventreader.cpp index 8a4c862..8c41020 100644 --- a/source/io/windows/eventreader.cpp +++ b/source/io/windows/eventreader.cpp @@ -13,11 +13,12 @@ struct EventReader::Private { OVERLAPPED overlapped; Handle event; - unsigned buf_size; - char *buffer; - unsigned buf_avail; - char *buf_next; - bool pending; + size_t buf_size = 0; + char *buffer = 0; + size_t buf_avail = 0; + char *buf_next = 0; + bool pending = false; + bool eof = false; }; @@ -30,9 +31,7 @@ EventReader::EventReader(Handle &h, unsigned size): priv->overlapped.hEvent = *priv->event; priv->buf_size = size; priv->buffer = new char[priv->buf_size]; - priv->buf_avail = 0; priv->buf_next = priv->buffer; - priv->pending = false; } EventReader::~EventReader() @@ -58,7 +57,9 @@ void EventReader::start() if(!ReadFile(*handle, priv->buffer, priv->buf_size, &ret, &priv->overlapped)) { unsigned err = GetLastError(); - if(err==ERROR_IO_PENDING) + if(err==ERROR_BROKEN_PIPE) + priv->eof = true; + else if(err==ERROR_IO_PENDING) priv->pending = true; else throw system_error("ReadFile"); @@ -77,7 +78,13 @@ void EventReader::wait() DWORD ret; if(!GetOverlappedResult(*handle, &priv->overlapped, &ret, true)) - throw system_error("GetOverlappedResult"); + { + DWORD err = GetLastError(); + if(err==ERROR_BROKEN_PIPE) + priv->eof = true; + else + throw system_error("GetOverlappedResult"); + } else { priv->buf_avail = ret; @@ -89,6 +96,9 @@ unsigned EventReader::read(char *buf, unsigned len) { if(!priv->buf_avail) { + if(priv->eof) + return 0; + // No data in buffer, try to get some start(); wait();