Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <cstdlib>
- #include <random>
- #include <iostream>
- using namespace std;
- size_t const BLOCK_SIZE = 4096;
- size_t const NUM_BLOCKS = ((size_t)1024 * 1024 * 1024 / BLOCK_SIZE);
- size_t const FILE_SIZE = NUM_BLOCKS * BLOCK_SIZE;
- int main()
- {
- unsigned const PARALLEL_DEGREE = 500;
- HANDLE hFile;
- OVERLAPPED aol[PARALLEL_DEGREE];
- BYTE abBlock[BLOCK_SIZE];
- HANDLE hIoCompletionPort;
- if( (hFile = CreateFile( TEXT("testfile"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL )) == INVALID_HANDLE_VALUE )
- return EXIT_FAILURE;
- aol[0].Offset = FILE_SIZE - BLOCK_SIZE;
- aol[0].OffsetHigh = 0;
- if( (aol[0].hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL ||
- !WriteFile( hFile, abBlock, FILE_SIZE - BLOCK_SIZE, NULL, &aol[0] ) && GetLastError() != ERROR_IO_PENDING )
- return EXIT_FAILURE;
- if( (hIoCompletionPort = CreateIoCompletionPort( hFile, NULL, NULL, 1 )) == NULL )
- return EXIT_FAILURE;
- random_device rd;
- mt19937 mt( rd() );
- uniform_int_distribution<DWORD> uid( 0, FILE_SIZE - BLOCK_SIZE );
- for( unsigned par = 0; par < PARALLEL_DEGREE; par++ )
- {
- aol[par].Offset = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
- aol[par].OffsetHigh = 0;
- aol[par].hEvent = NULL;
- if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, &aol[par] ) && GetLastError() != ERROR_IO_PENDING )
- return EXIT_FAILURE;
- }
- for( ; ; )
- {
- DWORD dwBytesTransferred;
- ULONG_PTR ulpKey;
- OVERLAPPED *pol;
- if( !GetQueuedCompletionStatus( hIoCompletionPort, &dwBytesTransferred, &ulpKey, &pol, INFINITE ) )
- return EXIT_FAILURE;
- pol->Offset = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
- pol->OffsetHigh = 0;
- pol->hEvent = NULL;
- if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, pol ) && GetLastError() != ERROR_IO_PENDING )
- return EXIT_FAILURE;
- }
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment