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