* fhandler.cc (is_at_eof): Drop static storage class. Drop err
parameter since we don't change the Win32 error here anymore. (fhandler_base::raw_read): Accommodate change to is_at_eof. * fhandler_disk_file.cc (fhandler_disk_file::pread): In binary mode use direct call to NtReadFile, rather than lseek/read. (fhandler_disk_file::pwrite): In binary mode use direct call to NtWriteFile, rather than lseek/write.
This commit is contained in:
		
							parent
							
								
									03406c1ae6
								
							
						
					
					
						commit
						392323df55
					
				|  | @ -1,3 +1,14 @@ | ||||||
|  | 2011-05-05  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  | 
 | ||||||
|  | 	* fhandler.cc (is_at_eof): Drop static storage class.  Drop err | ||||||
|  | 	parameter since we don't change the Win32 error here anymore. | ||||||
|  | 	(fhandler_base::raw_read): Accommodate change to is_at_eof. | ||||||
|  | 
 | ||||||
|  | 	* fhandler_disk_file.cc (fhandler_disk_file::pread): In binary mode use | ||||||
|  | 	direct call to NtReadFile, rather than lseek/read. | ||||||
|  | 	(fhandler_disk_file::pwrite): In binary mode use direct call to | ||||||
|  | 	NtWriteFile, rather than lseek/write. | ||||||
|  | 
 | ||||||
| 2011-05-05  Corinna Vinschen  <corinna@vinschen.de> | 2011-05-05  Corinna Vinschen  <corinna@vinschen.de> | ||||||
| 
 | 
 | ||||||
| 	* dcrt0.cc (dll_crt0_1): Reset locale to "C" even when dynamically | 	* dcrt0.cc (dll_crt0_1): Reset locale to "C" even when dynamically | ||||||
|  |  | ||||||
|  | @ -163,8 +163,8 @@ char *fhandler_base::get_proc_fd_name (char *buf) | ||||||
| 
 | 
 | ||||||
| /* Detect if we are sitting at EOF for conditions where Windows
 | /* Detect if we are sitting at EOF for conditions where Windows
 | ||||||
|    returns an error but UNIX doesn't.  */ |    returns an error but UNIX doesn't.  */ | ||||||
| static int __stdcall | int __stdcall | ||||||
| is_at_eof (HANDLE h, DWORD err) | is_at_eof (HANDLE h) | ||||||
| { | { | ||||||
|   IO_STATUS_BLOCK io; |   IO_STATUS_BLOCK io; | ||||||
|   FILE_POSITION_INFORMATION fpi; |   FILE_POSITION_INFORMATION fpi; | ||||||
|  | @ -176,7 +176,6 @@ is_at_eof (HANDLE h, DWORD err) | ||||||
| 					     FilePositionInformation)) | 					     FilePositionInformation)) | ||||||
|       && fsi.EndOfFile.QuadPart == fpi.CurrentByteOffset.QuadPart) |       && fsi.EndOfFile.QuadPart == fpi.CurrentByteOffset.QuadPart) | ||||||
|     return 1; |     return 1; | ||||||
|   SetLastError (err); |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -237,7 +236,7 @@ retry: | ||||||
| 	  /* `bytes_read' is supposedly valid.  */ | 	  /* `bytes_read' is supposedly valid.  */ | ||||||
| 	  break; | 	  break; | ||||||
| 	case ERROR_NOACCESS: | 	case ERROR_NOACCESS: | ||||||
| 	  if (is_at_eof (get_handle (), errcode)) | 	  if (is_at_eof (get_handle ())) | ||||||
| 	    { | 	    { | ||||||
| 	      bytes_read = 0; | 	      bytes_read = 0; | ||||||
| 	      break; | 	      break; | ||||||
|  |  | ||||||
|  | @ -1415,6 +1415,47 @@ out: | ||||||
| ssize_t __stdcall | ssize_t __stdcall | ||||||
| fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset) | fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset) | ||||||
| { | { | ||||||
|  |   /* In binary mode, we can use an atomic NtReadFile call. */ | ||||||
|  |   if (rbinary ()) | ||||||
|  |     { | ||||||
|  |       extern int __stdcall is_at_eof (HANDLE h); | ||||||
|  |       NTSTATUS status; | ||||||
|  |       IO_STATUS_BLOCK io; | ||||||
|  |       LARGE_INTEGER off = { QuadPart:offset }; | ||||||
|  | 
 | ||||||
|  |       status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, buf, count, | ||||||
|  | 			   &off, NULL); | ||||||
|  |       if (!NT_SUCCESS (status)) | ||||||
|  | 	{ | ||||||
|  | 	  if (pc.isdir ()) | ||||||
|  | 	    { | ||||||
|  | 	      set_errno (EISDIR); | ||||||
|  | 	      return -1; | ||||||
|  | 	    } | ||||||
|  | 	  if (status == (NTSTATUS) STATUS_ACCESS_VIOLATION) | ||||||
|  | 	    { | ||||||
|  | 	      if (is_at_eof (get_handle ())) | ||||||
|  | 		return 0; | ||||||
|  | 	      switch (mmap_is_attached_or_noreserve (buf, count)) | ||||||
|  | 		{ | ||||||
|  | 		case MMAP_NORESERVE_COMMITED: | ||||||
|  | 		  status = NtReadFile (get_handle (), NULL, NULL, NULL, &io, | ||||||
|  | 				       buf, count, &off, NULL); | ||||||
|  | 		  if (NT_SUCCESS (status)) | ||||||
|  | 		    return io.Information; | ||||||
|  | 		  break; | ||||||
|  | 		case MMAP_RAISE_SIGBUS: | ||||||
|  | 		  raise (SIGBUS); | ||||||
|  | 		default: | ||||||
|  | 		  break; | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	  __seterrno_from_nt_status (status); | ||||||
|  | 	  return -1; | ||||||
|  | 	} | ||||||
|  |       return io.Information; | ||||||
|  |     } | ||||||
|  |   /* Text mode stays slow and non-atomic. */ | ||||||
|   ssize_t res; |   ssize_t res; | ||||||
|   _off64_t curpos = lseek (0, SEEK_CUR); |   _off64_t curpos = lseek (0, SEEK_CUR); | ||||||
|   if (curpos < 0 || lseek (offset, SEEK_SET) < 0) |   if (curpos < 0 || lseek (offset, SEEK_SET) < 0) | ||||||
|  | @ -1435,6 +1476,23 @@ fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset) | ||||||
| ssize_t __stdcall | ssize_t __stdcall | ||||||
| fhandler_disk_file::pwrite (void *buf, size_t count, _off64_t offset) | fhandler_disk_file::pwrite (void *buf, size_t count, _off64_t offset) | ||||||
| { | { | ||||||
|  |   /* In binary mode, we can use an atomic NtWriteFile call. */ | ||||||
|  |   if (wbinary ()) | ||||||
|  |     { | ||||||
|  |       NTSTATUS status; | ||||||
|  |       IO_STATUS_BLOCK io; | ||||||
|  |       LARGE_INTEGER off = { QuadPart:offset }; | ||||||
|  | 
 | ||||||
|  |       status = NtWriteFile (get_handle (), NULL, NULL, NULL, &io, buf, count, | ||||||
|  | 			    &off, NULL); | ||||||
|  |       if (!NT_SUCCESS (status)) | ||||||
|  | 	{ | ||||||
|  | 	  __seterrno_from_nt_status (status); | ||||||
|  | 	  return -1; | ||||||
|  | 	} | ||||||
|  |       return io.Information; | ||||||
|  |     } | ||||||
|  |   /* Text mode stays slow and non-atomic. */ | ||||||
|   int res; |   int res; | ||||||
|   _off64_t curpos = lseek (0, SEEK_CUR); |   _off64_t curpos = lseek (0, SEEK_CUR); | ||||||
|   if (curpos < 0 || lseek (offset, SEEK_SET) < 0) |   if (curpos < 0 || lseek (offset, SEEK_SET) < 0) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue