-#ifdef WIN32
- // Initiate overlapped read if needed
- get_event_handle();
-
- if(overlapped)
- {
- DWORD ret;
- if(!GetOverlappedResult(handle[0], overlapped, &ret, !buf_avail))
- throw SystemError("Reading from pipe failed", GetLastError());
- else
- {
- buf_avail += ret;
- delete overlapped;
- overlapped = 0;
- }
- }
-
- unsigned ret = min(buf_avail, size);
- memcpy(buf, buf_next, ret);
- buf_next += ret;
- buf_avail -= ret;
-
- // Initiate another overlapped read in case someone is polling us
- get_event_handle();
-#else
- int ret = ::read(handle[0], buf, size);
- if(ret==-1)
- {
- if(errno==EAGAIN)
- return 0;
- else
- throw SystemError("Reading from pipe failed", errno);
- }
-#endif
-