74c0f9e8e6cb63e07857206e11a81be8bdd006ad
[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 #include <windows.h>\r
8 \r
9 #include "../smalloc.h"\r
10 #include "../file.h"\r
11 #include "../log.h"\r
12 \r
13 #define FIO_HAVE_ODIRECT\r
14 #define FIO_USE_GENERIC_RAND\r
15 #define FIO_HAVE_CHARDEV_SIZE\r
16 #define FIO_USE_GENERIC_RAND\r
17 \r
18 #define FIO_HAVE_FALLOCATE\r
19 #define FIO_HAVE_FDATASYNC\r
20 #define FIO_HAVE_WINDOWSAIO\r
21 \r
22 #define OS_MAP_ANON             MAP_ANON\r
23 \r
24 #define OS_CLOCK CLOCK_REALTIME\r
25 \r
26 typedef off_t off64_t;\r
27 \r
28 typedef struct {\r
29   LARGE_INTEGER Length;\r
30 } GET_LENGTH_INFORMATION;\r
31 \r
32 #define IOCTL_DISK_GET_LENGTH_INFO 0x7405C\r
33 \r
34 static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)\r
35 {\r
36         int rc = 0;\r
37         HANDLE hFile;\r
38 \r
39         if (f->hFile == NULL) {\r
40                 hFile = CreateFile(f->file_name, (GENERIC_READ | GENERIC_WRITE),\r
41                         (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, OPEN_EXISTING, 0, NULL);\r
42         } else {\r
43                 hFile = f->hFile;\r
44         }\r
45 \r
46         GET_LENGTH_INFORMATION info;\r
47         DWORD outBytes;\r
48         LARGE_INTEGER size;\r
49         size.QuadPart = 0;\r
50         if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))\r
51                 *bytes = info.Length.QuadPart;\r
52         else\r
53                 rc = EIO;\r
54         }\r
55 \r
56         /* If we were passed a POSIX fd,\r
57          * close the HANDLE we created via CreateFile */\r
58         if (hFile != INVALID_HANDLE_VALUE && f->hFile == NULL)\r
59                 CloseHandle(hFile);\r
60 \r
61         return rc;\r
62 }\r
63 \r
64 static inline int chardev_size(struct fio_file *f, unsigned long long *bytes)\r
65 {\r
66         return blockdev_size(f, bytes);\r
67 }\r
68 \r
69 {\r
70 \r
71 static inline int blockdev_invalidate_cache(struct fio_file *f)\r
72 {\r
73         BOOL bSuccess = FlushFileBuffers(f->hFile);\r
74         if (!bSuccess)\r
75                 log_info("blockdev_invalidate_cache - FlushFileBuffers failed\n");\r
76 \r
77         return 0;\r
78 }\r
79 \r
80 static inline unsigned long long os_phys_mem(void)\r
81 {\r
82         SYSTEM_INFO sysInfo;\r
83         unsigned long addr;\r
84         GetSystemInfo(&sysInfo);\r
85         addr = (unsigned long)sysInfo.lpMaximumApplicationAddress;\r
86         return addr;\r
87 }\r
88 \r
89 static inline void os_get_tmpdir(char *path, int len)\r
90 {\r
91         GetTempPath(len, path);\r
92 }\r
93 \r
94 #ifdef MADV_FREE\r
95 #define FIO_MADV_FREE   MADV_FREE\r
96 #endif\r
97 \r
98 \r
99 #endif /* FIO_OS_WINDOWS_H */\r