Я пытаюсь использовать IOCP
для чтения файлов в асинхронном режиме.
Это хорошо работает в 99% случаев ... но в 1% случаев запрос, кажется, никогда не завершается, и поэтомуоперация просто ждет вечно.
Последовательность вызовов API для зависшего файла:
# Time of Day Relative Time Thread Module Category API Return Value Error Duration
1160 4:14:50.142 PM 0:00:00:308 1 ghc-stage2.exe File Management CreateFileW ( "\\?\<path>\llvm-targets", GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN, NULL ) 0x00000000000001f0 0.0001230
1173 4:14:50.143 PM 0:00:00:309 1 ghc-stage2.exe File Management CreateIoCompletionPort ( 0x00000000000001f0, 0x00000000000001e4, 496, 0 ) 0x00000000000001e4 0.0000407
1179 4:14:50.143 PM 0:00:00:309 1 ghc-stage2.exe File Management GetFileType ( 0x00000000000001f0 ) FILE_TYPE_DISK 0.0000039
1190 4:14:50.143 PM 0:00:00:309 1 ghc-stage2.exe File Management SetFileCompletionNotificationModes ( 0x00000000000001f0, 3 ) TRUE 0.0000075
1224 4:14:50.144 PM 0:00:00:310 1 ghc-stage2.exe Error Handling GetLastError ( ) ERROR_IO_PENDING 0.0000009
1223 4:14:50.143 PM 0:00:00:309 1 ghc-stage2.exe File Management ReadFile ( 0x00000000000001f0, 0x00000000074d7010, 8192, NULL, 0x00000000073670e0 ) FALSE 997 = Overlapped I/O operation is in progress. 0.0000811
1276 4:14:50.144 PM 0:00:00:310 5 ghc-stage2.exe File Management GetQueuedCompletionStatusEx ( 0x00000000000001e4, 0x0000000007406340, 64, 0x0000000007367140, INFINITE, FALSE )
Даже при чтении файлов по одному это, кажется, происходит, и я не уверен, почему,Сначала я думал, что указатель, содержащий структуру LPOVERLAPPED_ENTRY
, может стать недействительным, но проверка местоположения с помощью gdb
показывает, что он все еще хорош.
(gdb) x/12w 0x0000000007406340
0x7406340: 0x00000000 0x00000000 0x00000000 0x00000000
0x7406350: 0x00000000 0x00000000 0x00000000 0x00000000
0x7406360: 0x00000000 0x00000000 0x00000000 0x00000000
Кто-нибудь знает, что может происходить?