FIO Windows update
[fio.git] / os / os-windows.h
index f5da6a5d583d53c737b3529a596f50e177f5f7d7..74c0f9e8e6cb63e07857206e11a81be8bdd006ad 100644 (file)
@@ -4,7 +4,11 @@
 \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
+#define OS_CLOCK CLOCK_REALTIME\r
 \r
-typedef void* HANDLE;\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
@@ -44,42 +31,50 @@ typedef struct {
 \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 | GENERIC_WRITE),\r
+                       (FILE_SHARE_READ | FILE_SHARE_WRITE), 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
+\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
 {\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
+static inline int blockdev_invalidate_cache(struct fio_file *f)\r
+{\r
+       BOOL bSuccess = FlushFileBuffers(f->hFile);\r
+       if (!bSuccess)\r
+               log_info("blockdev_invalidate_cache - FlushFileBuffers failed\n");\r
 \r
-       return rc;\r
+       return 0;\r
 }\r
 \r
 static inline unsigned long long os_phys_mem(void)\r