Various fixes/updates
[fio.git] / os / os-windows.h
index f5da6a5d583d53c737b3529a596f50e177f5f7d7..9edacf335090882d82e53201b01e8cec1bb2b28b 100644 (file)
@@ -1,10 +1,13 @@
 #ifndef FIO_OS_WINDOWS_H\r
 #define FIO_OS_WINDOWS_H\r
 \r
 #ifndef FIO_OS_WINDOWS_H\r
 #define FIO_OS_WINDOWS_H\r
 \r
-\r
 #include <sys/types.h>\r
 #include <errno.h>\r
 #include <sys/types.h>\r
 #include <errno.h>\r
+#include <windows.h>\r
 \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
 \r
 #define FIO_HAVE_ODIRECT\r
 #define FIO_USE_GENERIC_RAND\r
 #define FIO_HAVE_FDATASYNC\r
 #define FIO_HAVE_WINDOWSAIO\r
 \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
 #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
 \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
 typedef struct {\r
   LARGE_INTEGER Length;\r
@@ -44,42 +30,45 @@ typedef struct {
 \r
 #define IOCTL_DISK_GET_LENGTH_INFO 0x7405C\r
 \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
 {\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
        }\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
 }\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
 {\r
-       return blockdev_size(fd, bytes);\r
+       return blockdev_size(f, bytes);\r
 }\r
 \r
 }\r
 \r
-static inline int blockdev_invalidate_cache(int fd)\r
+static inline int blockdev_invalidate_cache(struct fio_file *f)\r
 {\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
 }\r
 \r
 static inline unsigned long long os_phys_mem(void)\r
@@ -100,5 +89,4 @@ static inline void os_get_tmpdir(char *path, int len)
 #define FIO_MADV_FREE  MADV_FREE\r
 #endif\r
 \r
 #define FIO_MADV_FREE  MADV_FREE\r
 #endif\r
 \r
-\r
 #endif /* FIO_OS_WINDOWS_H */\r
 #endif /* FIO_OS_WINDOWS_H */\r