os-windows.h revision 03e20d687566753b90383571e5e152c5142bdffd
1#ifndef FIO_OS_WINDOWS_H
2#define FIO_OS_WINDOWS_H
3
4
5#include <sys/types.h>
6#include <errno.h>
7
8
9#define FIO_HAVE_ODIRECT
10#define FIO_USE_GENERIC_RAND
11#define FIO_HAVE_CHARDEV_SIZE
12#define FIO_USE_GENERIC_RAND
13
14#define FIO_HAVE_FALLOCATE
15#define FIO_HAVE_FDATASYNC
16#define FIO_HAVE_WINDOWSAIO
17
18/* TODO add support for FIO_HAVE_CPU_AFFINITY */
19
20#define OS_MAP_ANON		MAP_ANON
21
22typedef off_t off64_t;
23
24
25#define FIO_NOTUNIX
26
27#include <windows.h>
28#include <io.h>
29
30typedef void* HANDLE;
31
32BOOL WINAPI GetFileSizeEx(
33   HANDLE hFile,
34   PLARGE_INTEGER lpFileSize
35);
36
37long _get_osfhandle(
38   int fd
39);
40
41typedef struct {
42  LARGE_INTEGER Length;
43} GET_LENGTH_INFORMATION;
44
45#define IOCTL_DISK_GET_LENGTH_INFO 0x7405C
46
47
48static inline int blockdev_size(int fd, unsigned long long *bytes)
49{
50	int rc = 0;
51	HANDLE hFile = (HANDLE)_get_osfhandle(fd);
52	if (hFile != INVALID_HANDLE_VALUE)
53	{
54		GET_LENGTH_INFORMATION info;
55		DWORD outBytes;
56		LARGE_INTEGER size;
57		size.QuadPart = 0;
58		if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))
59			*bytes = info.Length.QuadPart;
60		else
61			rc = EIO;
62	}
63
64	return 0;
65}
66
67static inline int chardev_size(int fd, unsigned long long *bytes)
68{
69	return blockdev_size(fd, bytes);
70}
71
72static inline int blockdev_invalidate_cache(int fd)
73{
74	int rc = 0;
75	HANDLE hFile = (HANDLE)_get_osfhandle(fd);
76
77	if (hFile != INVALID_HANDLE_VALUE)
78		FlushFileBuffers(hFile);
79	else
80		rc = EIO;
81
82	return rc;
83}
84
85static inline unsigned long long os_phys_mem(void)
86{
87	SYSTEM_INFO sysInfo;
88	unsigned long addr;
89	GetSystemInfo(&sysInfo);
90	addr = (unsigned long)sysInfo.lpMaximumApplicationAddress;
91	return addr;
92}
93
94static inline void os_get_tmpdir(char *path, int len)
95{
96	GetTempPath(len, path);
97}
98
99#ifdef MADV_FREE
100#define FIO_MADV_FREE	MADV_FREE
101#endif
102
103
104#endif /* FIO_OS_WINDOWS_H */
105