[Openmcl-cvs-notifications] r11957 - /trunk/source/lisp-kernel/windows-calls.c
gb at clozure.com
gb at clozure.com
Sat Apr 18 05:54:03 EDT 2009
Author: gb
Date: Sat Apr 18 05:54:03 2009
New Revision: 11957
Log:
Try to handle overlapped I/O in lisp_write(), too (in trunk.)
Modified:
trunk/source/lisp-kernel/windows-calls.c
Modified: trunk/source/lisp-kernel/windows-calls.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/windows-calls.c (original)
+++ trunk/source/lisp-kernel/windows-calls.c Sat Apr 18 05:54:03 2009
@@ -349,7 +349,8 @@
{
HANDLE hevent;
OVERLAPPED overlapped;
- DWORD err, nwritten;
+ DWORD err, nwritten, wait_result;
+ pending_io pending;
TCR *tcr =3D (TCR *)get_tcr(1);
=
hevent =3D (HANDLE)tcr->io_datum;
@@ -366,12 +367,39 @@
overlapped.Offset =3D SetFilePointer(hfile, 0, &(overlapped.OffsetHigh=
), FILE_CURRENT);
}
=
+
+ pending.h =3D hfile;
+ pending.o =3D &overlapped;
+ tcr->pending_io_info =3D &pending;
overlapped.hEvent =3D hevent;
ResetEvent(hevent);
if (WriteFile(hfile, buf, count, &nwritten, &overlapped)) {
+ tcr->pending_io_info =3D NULL;
return nwritten;
}
=
+ err =3D GetLastError();
+ if (err !=3D ERROR_IO_PENDING) {
+ _dosmaperr(err);
+ tcr->pending_io_info =3D NULL;
+ return -1;
+ }
+ err =3D 0;
+ wait_result =3D WaitForSingleObjectEx(hevent, INFINITE, true);
+ tcr->pending_io_info =3D NULL;
+ if (wait_result =3D=3D WAIT_OBJECT_0) {
+ err =3D overlapped.Internal;
+ if (err) {
+ _dosmaperr(err);
+ return -1;
+ }
+ return overlapped.InternalHigh;
+ }
+ if (wait_result =3D=3D WAIT_IO_COMPLETION) {
+ CancelIo(hfile);
+ errno =3D EINTR;
+ return -1;
+ }
err =3D GetLastError();
_dosmaperr(err);
return -1;
More information about the Openmcl-cvs-notifications
mailing list