[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