def _iocp_recvall(self, bufsize, *args):
"""Internal use only; use 'recvall' with 'yield' instead.
"""
buf = [win32file.AllocateReadBuffer(min(bufsize, 1048576))]
pending = [bufsize]
def _recvall(err, n):
if err or n == 0:
if self._timeout and self._notifier:
self._notifier._del_timeout(self)
self._read_overlap.object = self._read_result = None
if not err:
err = winerror.ERROR_CONNECTION_INVALID
if self._read_task:
if (err == winerror.ERROR_CONNECTION_INVALID or
err == winerror.ERROR_OPERATION_ABORTED):
self._read_task._proceed_('')
else:
self._read_task.throw(socket.error(err))
else:
self._read_result.append(buf[0][:n])
pending[0] -= n
if pending[0]:
buf[0] = win32file.AllocateReadBuffer(min(pending[0], 1048576))
err, n = win32file.WSARecv(self._fileno, buf[0], self._read_overlap, 0)
if err != winerror.ERROR_IO_PENDING and err:
if self._timeout and self._notifier:
self._notifier._del_timeout(self)
self._read_overlap.object = self._read_result = None
self._read_task.throw(socket.error(err))
else:
buf[0] = ''.join(self._read_result)
if self._timeout and self._notifier:
self._notifier._del_timeout(self)
self._read_overlap.object = self._read_result = None
self._read_task._proceed_(buf[0])
if not self._scheduler:
self._scheduler = Pycos.scheduler()
self._notifier = self._scheduler._notifier
self._register()
if self._timeout:
self._notifier._add_timeout(self)
self._read_overlap.object = _recvall
self._read_result = []
self._read_task = Pycos.cur_task(self._scheduler)
self._read_task._await_()
err, n = win32file.WSARecv(self._fileno, buf[0], self._read_overlap, 0)
if err != winerror.ERROR_IO_PENDING and err:
self._read_overlap.object(err, n)
python类AllocateReadBuffer()的实例源码
def SpoolWorker(srcHandle, destHandle, outFiles, doneEvent):
"""Thread entry point for implementation of MakeSpyPipe"""
try:
buffer = win32file.AllocateReadBuffer(SPOOL_BYTES)
while 1:
try:
#print >> SPOOL_ERROR, "Calling ReadFile..."; SPOOL_ERROR.flush()
hr, data = win32file.ReadFile(srcHandle, buffer)
#print >> SPOOL_ERROR, "ReadFile returned '%s', '%s'" % (str(hr), str(data)); SPOOL_ERROR.flush()
if hr != 0:
raise Exception("win32file.ReadFile returned %i, '%s'" % (hr, data))
elif len(data) == 0:
break
except pywintypes.error, e:
#print >> SPOOL_ERROR, "ReadFile threw '%s'" % str(e); SPOOL_ERROR.flush()
if e.args[0] == winerror.ERROR_BROKEN_PIPE:
break
else:
raise e
#print >> SPOOL_ERROR, "Writing to %i file objects..." % len(outFiles); SPOOL_ERROR.flush()
for f in outFiles:
f.write(data)
#print >> SPOOL_ERROR, "Done writing to file objects."; SPOOL_ERROR.flush()
#print >> SPOOL_ERROR, "Writing to destination %s" % str(destHandle); SPOOL_ERROR.flush()
if destHandle:
#print >> SPOOL_ERROR, "Calling WriteFile..."; SPOOL_ERROR.flush()
hr, bytes = win32file.WriteFile(destHandle, data)
#print >> SPOOL_ERROR, "WriteFile() passed %i bytes and returned %i, %i" % (len(data), hr, bytes); SPOOL_ERROR.flush()
if hr != 0 or bytes != len(data):
raise Exception("win32file.WriteFile() passed %i bytes and returned %i, %i" % (len(data), hr, bytes))
srcHandle.Close()
if doneEvent:
win32event.SetEvent(doneEvent)
if destHandle:
destHandle.Close()
except:
info = sys.exc_info()
SPOOL_ERROR.writelines(apply(traceback.format_exception, info), '')
SPOOL_ERROR.flush()
del info