Переглянути джерело

cancell all blocking and non-blocking IO before closing the port handle to avoid infinite blocking

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7650 8c9fc860-2736-0410-a75d-ab315db34111
eth.morozova 7 роки тому
батько
коміт
a1a709df00
1 змінених файлів з 6 додано та 5 видалено
  1. 6 5
      source/Win32.V24.Mod

+ 6 - 5
source/Win32.V24.Mod

@@ -122,7 +122,7 @@ TYPE
 			ASSERT ( LEN( buf ) >= ofs + len );   (* array bound check not implemented in Kernel32.WriteFile *)
 			IF (handle # Kernel32.InvalidHandleValue) THEN
 				written := 0;
-				ret := Kernel32.WriteFile( handle, buf[ofs], len, written, ADDRESSOF(wOverlapped) );
+				ret := Kernel32.WriteFile( handle, buf[ofs], len, written, wOverlapped );
 				IF ret = Kernel32.False THEN
 					ret := Kernel32.GetOverlappedResult(handle,wOverlapped,written,Kernel32.True);
 				END;
@@ -143,7 +143,7 @@ TYPE
 		BEGIN
 			IF handle # Kernel32.InvalidHandleValue THEN
 				written := 0;
-				ret := Kernel32.WriteFile( handle, ch, 1, written, ADDRESSOF(wOverlapped) );
+				ret := Kernel32.WriteFile( handle, ch, 1, written, wOverlapped );
 				IF ret = Kernel32.False THEN
 					ret := Kernel32.GetOverlappedResult(handle,wOverlapped,written,Kernel32.True);
 				END;
@@ -174,7 +174,7 @@ TYPE
 				(* blocking read of the minimally required amount of data *)
 				IF min > 0 THEN
 					read := 0;
-					ret := Kernel32.ReadFile( handle, buf[ofs], min, read, ADDRESSOF(rOverlapped) );
+					ret := Kernel32.ReadFile( handle, buf[ofs], min, read, rOverlapped );
 					IF ret = Kernel32.False THEN
 						ret := Kernel32.GetOverlappedResult(handle,rOverlapped,read,Kernel32.True);
 					END;
@@ -188,7 +188,7 @@ TYPE
 				l := MIN(size,Available());
 				IF l > 0 THEN
 					read := 0;
-					ret := Kernel32.ReadFile( handle, buf[ofs], l, read, ADDRESSOF(rOverlapped) );
+					ret := Kernel32.ReadFile( handle, buf[ofs], l, read, rOverlapped );
 					IF ret = Kernel32.False THEN
 						ret := Kernel32.GetOverlappedResult(handle,rOverlapped,read,Kernel32.True);
 					END;
@@ -208,7 +208,7 @@ TYPE
 		BEGIN
 			IF handle # Kernel32.InvalidHandleValue THEN
 				read := 0;
-				ret := Kernel32.ReadFile( handle, ch, 1, read, ADDRESSOF(rOverlapped) );
+				ret := Kernel32.ReadFile( handle, ch, 1, read, rOverlapped );
 				IF ret = Kernel32.False THEN
 					ret := Kernel32.GetOverlappedResult(handle,rOverlapped,read,Kernel32.True);
 				END;
@@ -394,6 +394,7 @@ TYPE
 		PROCEDURE Close*;
 		BEGIN {EXCLUSIVE}
 			IF handle # Kernel32.InvalidHandleValue THEN
+				Kernel32.CancelIoEx(handle, NIL);
 				Kernel32.CloseHandle( handle );  handle := Kernel32.InvalidHandleValue;
 				IF rOverlapped.hEvent # NIL THEN Kernel32.CloseHandle(rOverlapped.hEvent); rOverlapped.hEvent := NIL; END;
 				IF wOverlapped.hEvent # NIL THEN Kernel32.CloseHandle(wOverlapped.hEvent); wOverlapped.hEvent := NIL; END;