#ifndef FIO_OS_WINDOWS_H\r
#define FIO_OS_WINDOWS_H\r
\r
-\r
#include <sys/types.h>\r
#include <errno.h>\r
+#include <windows.h>\r
\r
+#include "../smalloc.h"\r
+#include "../file.h"\r
+#include "../log.h"\r
\r
#define FIO_HAVE_ODIRECT\r
#define FIO_USE_GENERIC_RAND\r
#define FIO_HAVE_FDATASYNC\r
#define FIO_HAVE_WINDOWSAIO\r
\r
-/* TODO add support for FIO_HAVE_CPU_AFFINITY */\r
-\r
#define OS_MAP_ANON MAP_ANON\r
\r
-typedef off_t off64_t;\r
-\r
-\r
-#define FIO_NOTUNIX\r
-\r
-#include <windows.h>\r
-#include <io.h>\r
-\r
-typedef void* HANDLE;\r
+#define OS_CLOCK CLOCK_REALTIME\r
\r
-BOOL WINAPI GetFileSizeEx(\r
- HANDLE hFile,\r
- PLARGE_INTEGER lpFileSize\r
-);\r
-\r
-long _get_osfhandle(\r
- int fd\r
-);\r
+typedef off_t off64_t;\r
\r
typedef struct {\r
LARGE_INTEGER Length;\r
\r
#define IOCTL_DISK_GET_LENGTH_INFO 0x7405C\r
\r
-\r
-static inline int blockdev_size(int fd, unsigned long long *bytes)\r
+static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)\r
{\r
int rc = 0;\r
- HANDLE hFile = (HANDLE)_get_osfhandle(fd);\r
- if (hFile != INVALID_HANDLE_VALUE)\r
- {\r
- GET_LENGTH_INFORMATION info;\r
- DWORD outBytes;\r
- LARGE_INTEGER size;\r
- size.QuadPart = 0;\r
- if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))\r
- *bytes = info.Length.QuadPart;\r
- else\r
- rc = EIO;\r
+ HANDLE hFile;\r
+\r
+ if (f->hFile == NULL) {\r
+ hFile = CreateFile(f->file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,\r
+ NULL, OPEN_EXISTING, 0, NULL);\r
+ } else {\r
+ hFile = f->hFile;\r
}\r
\r
- return 0;\r
+ GET_LENGTH_INFORMATION info;\r
+ DWORD outBytes;\r
+ LARGE_INTEGER size;\r
+ size.QuadPart = 0;\r
+ if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL))\r
+ *bytes = info.Length.QuadPart;\r
+ else\r
+ rc = EIO;\r
+\r
+ /* If we were passed a POSIX fd,\r
+ * close the HANDLE we created via CreateFile */\r
+ if (hFile != INVALID_HANDLE_VALUE && f->hFile == NULL)\r
+ CloseHandle(hFile);\r
+\r
+ return rc;\r
}\r
\r
-static inline int chardev_size(int fd, unsigned long long *bytes)\r
+static inline int chardev_size(struct fio_file *f, unsigned long long *bytes)\r
{\r
- return blockdev_size(fd, bytes);\r
+ return blockdev_size(f, bytes);\r
}\r
\r
-static inline int blockdev_invalidate_cache(int fd)\r
+static inline int blockdev_invalidate_cache(struct fio_file *f)\r
{\r
- int rc = 0;\r
- HANDLE hFile = (HANDLE)_get_osfhandle(fd);\r
-\r
- if (hFile != INVALID_HANDLE_VALUE)\r
- FlushFileBuffers(hFile);\r
- else\r
- rc = EIO;\r
-\r
- return rc;\r
+ /* There's no way to invalidate the cache in Windows\r
+ * so just pretend to succeed */\r
+ return 0;\r
}\r
\r
static inline unsigned long long os_phys_mem(void)\r
#define FIO_MADV_FREE MADV_FREE\r
#endif\r
\r
-\r
#endif /* FIO_OS_WINDOWS_H */\r