HP-UX disk query size
[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 #define FIO_PREFERRED_ENGINE    "windowsaio"\r
26 \r
27 typedef off_t off64_t;\r
28 \r
29 typedef struct {\r
30   LARGE_INTEGER Length;\r
31 } GET_LENGTH_INFORMATION;\r
32 \r
33 #define IOCTL_DISK_GET_LENGTH_INFO 0x7405C\r
34 \r
35 static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)\r
36 {\r
37         int rc = 0;\r
38         HANDLE hFile;\r
39 \r
40         if (f->hFile == NULL) {\r
41                 hFile = CreateFile(f->file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,\r
42                                 NULL, OPEN_EXISTING, 0, NULL);\r
43         } else {\r
44                 hFile = f->hFile;\r
45         }\r
46 \r
47         GET_LENGTH_INFORMATION info;\r
48         DWORD outBytes;\r
49         LARGE_INTEGER size;\r
50         size.QuadPart = 0;\r
51         if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))\r
52                 *bytes = info.Length.QuadPart;\r
53         else\r
54                 rc = EIO;\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 static inline int blockdev_invalidate_cache(struct fio_file *f)\r
70 {\r
71         /* There's no way to invalidate the cache in Windows\r
72          * so just pretend to succeed */\r
73         return 0;\r
74 }\r
75 \r
76 static inline unsigned long long os_phys_mem(void)\r
77 {\r
78         SYSTEM_INFO sysInfo;\r
79         unsigned long addr;\r
80         GetSystemInfo(&sysInfo);\r
81         addr = (unsigned long)sysInfo.lpMaximumApplicationAddress;\r
82         return addr;\r
83 }\r
84 \r
85 static inline void os_get_tmpdir(char *path, int len)\r
86 {\r
87         GetTempPath(len, path);\r
88 }\r
89 \r
90 #ifdef MADV_FREE\r
91 #define FIO_MADV_FREE   MADV_FREE\r
92 #endif\r
93 \r
94 #endif /* FIO_OS_WINDOWS_H */\r