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