diff --git a/tst/fsbench/fsbench.c b/tst/fsbench/fsbench.c index 1ac04b12..e289062c 100644 --- a/tst/fsbench/fsbench.c +++ b/tst/fsbench/fsbench.c @@ -24,7 +24,9 @@ #include static BOOLEAN OptEmptyCache = FALSE; +static CHAR OptEmptyCacheDrive = 0; static ULONG OptFileCount = 1000; +static ULONG OptOpenCount = 10; static ULONG OptListCount = 100; static ULONG OptRdwrFileSize = 4096 * 1024; static ULONG OptRdwrCcCount = 100; @@ -32,43 +34,44 @@ static ULONG OptRdwrNcCount = 100; static ULONG OptMmapFileSize = 4096 * 1024; static ULONG OptMmapCount = 100; -static void file_create_dotest(ULONG CreateDisposition) +static void file_create_dotest(ULONG CreateDisposition, ULONG OpenCount) { HANDLE Handle; BOOL Success; WCHAR FileName[MAX_PATH]; - for (ULONG Index = 0; OptFileCount > Index; Index++) - { - StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file%lu", Index); - Handle = CreateFileW(FileName, - GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, - CreateDisposition, FILE_ATTRIBUTE_NORMAL, - 0); - ASSERT(INVALID_HANDLE_VALUE != Handle); - Success = CloseHandle(Handle); - ASSERT(Success); - } + for (ULONG OpenIndex = 0; OpenCount > OpenIndex; OpenIndex++) + for (ULONG Index = 0; OptFileCount > Index; Index++) + { + StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file%lu", Index); + Handle = CreateFileW(FileName, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + CreateDisposition, FILE_ATTRIBUTE_NORMAL, + 0); + ASSERT(INVALID_HANDLE_VALUE != Handle); + Success = CloseHandle(Handle); + ASSERT(Success); + } } static void file_create_test(void) { - file_create_dotest(CREATE_NEW); + file_create_dotest(CREATE_NEW, 1); } static void file_open_test(void) { - file_create_dotest(OPEN_EXISTING); + file_create_dotest(OPEN_EXISTING, OptOpenCount); } static void file_overwrite_test(void) { - file_create_dotest(CREATE_ALWAYS); + file_create_dotest(CREATE_ALWAYS, 1); } static void file_attr_test(void) { WCHAR FileName[MAX_PATH]; DWORD FileAttributes; - for (ULONG ListIndex = 0; OptListCount > ListIndex; ListIndex++) + for (ULONG OpenIndex = 0; OptOpenCount > OpenIndex; OpenIndex++) for (ULONG Index = 0; OptFileCount > Index; Index++) { StringCbPrintfW(FileName, sizeof FileName, L"fsbench-file%lu", Index); @@ -418,6 +421,17 @@ static void EmptyCache(const char *name, void (*fn)(void), int v) ASSERT(0 == NtSetSystemInformation(80 /*SystemMemoryListInformation*/, &Command, sizeof Command)); Command = 4 /*MemoryPurgeStandbyList*/; ASSERT(0 == NtSetSystemInformation(80 /*SystemMemoryListInformation*/, &Command, sizeof Command)); + + /* optionally invalidate the volume cache; see https://stackoverflow.com/a/7701908/568557 */ + if (OptEmptyCacheDrive) + { + WCHAR VolumeNameBuf[] = L"\\\\.\\X:"; + HANDLE VolumeHandle; + VolumeNameBuf[4] = OptEmptyCacheDrive; + VolumeHandle = CreateFileW(VolumeNameBuf, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if (INVALID_HANDLE_VALUE != VolumeHandle) + CloseHandle(VolumeHandle); + } } else if (-1 == v) /* teardown */ @@ -478,11 +492,22 @@ int main(int argc, char *argv[]) OptEmptyCache = TRUE; rmarg(argv, argc, argi); } + else if (0 == strncmp("--empty-cache=", a, sizeof "--empty-cache=" - 1)) + { + OptEmptyCache = TRUE; + OptEmptyCacheDrive = *(a + sizeof "--empty-cache=" - 1); + rmarg(argv, argc, argi); + } else if (0 == strncmp("--files=", a, sizeof "--files=" - 1)) { OptFileCount = strtoul(a + sizeof "--files=" - 1, 0, 10); rmarg(argv, argc, argi); } + else if (0 == strncmp("--open=", a, sizeof "--open=" - 1)) + { + OptOpenCount = strtoul(a + sizeof "--open=" - 1, 0, 10); + rmarg(argv, argc, argi); + } else if (0 == strncmp("--list=", a, sizeof "--list=" - 1)) { OptListCount = strtoul(a + sizeof "--list=" - 1, 0, 10);