1 #ifndef FIO_OS_WINDOWS_H
\r
2 #define FIO_OS_WINDOWS_H
\r
4 #define FIO_OS os_windows
\r
6 #include <sys/types.h>
\r
12 #include "../smalloc.h"
\r
13 #include "../file.h"
\r
16 #define FIO_HAVE_ODIRECT
\r
17 #define FIO_HAVE_CPU_AFFINITY
\r
18 #define FIO_HAVE_CHARDEV_SIZE
\r
19 #define FIO_HAVE_FALLOCATE
\r
20 #define FIO_HAVE_FDATASYNC
\r
21 #define FIO_HAVE_WINDOWSAIO
\r
22 #define FIO_HAVE_GETTID
\r
24 #define FIO_OS_HAVE_SOCKLEN_T
\r
25 typedef int fio_socklen_t;
\r
27 #define FIO_USE_GENERIC_RAND
\r
29 #define OS_MAP_ANON MAP_ANON
\r
31 #define OS_CLOCK CLOCK_REALTIME
\r
33 #define FIO_PREFERRED_ENGINE "windowsaio"
\r
35 #define FIO_LITTLE_ENDIAN
\r
36 #define fio_swap16(x) _byteswap_ushort(x)
\r
37 #define fio_swap32(x) _byteswap_ulong(x)
\r
38 #define fio_swap64(x) _byteswap_uint64(x)
\r
40 typedef off_t off64_t;
\r
43 LARGE_INTEGER Length;
\r
44 } GET_LENGTH_INFORMATION;
\r
46 #define IOCTL_DISK_GET_LENGTH_INFO 0x7405C
\r
48 pid_t cygwin_winpid_to_pid(int winpid);
\r
50 static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)
\r
55 if (f->hFile == NULL) {
\r
56 hFile = CreateFile(f->file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
\r
57 NULL, OPEN_EXISTING, 0, NULL);
\r
62 GET_LENGTH_INFORMATION info;
\r
66 if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))
\r
67 *bytes = info.Length.QuadPart;
\r
71 /* If we were passed a POSIX fd,
\r
72 * close the HANDLE we created via CreateFile */
\r
73 if (hFile != INVALID_HANDLE_VALUE && f->hFile == NULL)
\r
79 static inline int chardev_size(struct fio_file *f, unsigned long long *bytes)
\r
81 return blockdev_size(f, bytes);
\r
84 static inline int blockdev_invalidate_cache(struct fio_file *f)
\r
86 /* There's no way to invalidate the cache in Windows
\r
87 * so just pretend to succeed */
\r
91 static inline unsigned long long os_phys_mem(void)
\r
93 SYSTEM_INFO sysInfo;
\r
95 GetSystemInfo(&sysInfo);
\r
96 addr = (unsigned long)sysInfo.lpMaximumApplicationAddress;
\r
100 static inline void os_get_tmpdir(char *path, int len)
\r
102 GetTempPath(len, path);
\r
105 typedef DWORD_PTR os_cpu_mask_t;
\r
107 static inline int gettid(void)
\r
109 return GetCurrentThreadId();
\r
112 static inline int pid_to_winpid(int pid)
\r
115 DWORD outbytes = 0;
\r
119 allocsize = sizeof(DWORD) * 1024;
\r
122 if (allocsize == outbytes)
\r
125 ids = realloc(ids, allocsize);
\r
126 EnumProcesses(ids, allocsize, &outbytes);
\r
127 } while (allocsize == outbytes);
\r
129 for (int i = 0; i < (outbytes/sizeof(DWORD)); i++) {
\r
130 if (cygwin_winpid_to_pid(ids[i]) == pid) {
\r
140 HANDLE WINAPI OpenThread(
\r
141 DWORD dwDesiredAccess,
\r
142 BOOL bInheritHandle,
\r
145 DWORD WINAPI GetProcessIdOfThread(HANDLE Thread);
\r
147 static inline int fio_setaffinity(int pid, os_cpu_mask_t cpumask)
\r
153 h = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, TRUE, pid);
\r
155 bSuccess = SetThreadAffinityMask(h, cpumask);
\r
157 // then we might have a process id instead of a thread id
\r
158 winpid = pid_to_winpid(pid);
\r
159 h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION, TRUE, winpid);
\r
163 bSuccess = SetProcessAffinityMask(h, cpumask);
\r
168 return (bSuccess)? 0 : -1;
\r
171 static inline void fio_getaffinity(int pid, os_cpu_mask_t *mask)
\r
173 os_cpu_mask_t systemMask;
\r
176 HANDLE h = OpenThread(THREAD_QUERY_INFORMATION, TRUE, pid);
\r
178 winpid = GetProcessIdOfThread(h);
\r
180 winpid = pid_to_winpid(pid);
\r
182 h = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, winpid);
\r
185 GetProcessAffinityMask(h, mask, &systemMask);
\r
188 fprintf(stderr, "fio_getaffinity failed: failed to get handle for pid %d\n", pid);
\r
193 static inline void fio_cpu_clear(os_cpu_mask_t *mask, int cpu)
\r
195 *mask ^= 1 << (cpu-1);
\r
198 static inline void fio_cpu_set(os_cpu_mask_t *mask, int cpu)
\r
200 *mask |= 1 << (cpu-1);
\r
203 static inline int fio_cpuset_init(os_cpu_mask_t *mask)
\r
209 static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
\r
214 #define FIO_MAX_CPUS MAXIMUM_PROCESSORS
\r
217 #define FIO_MADV_FREE MADV_FREE
\r
220 #endif /* FIO_OS_WINDOWS_H */
\r