X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=os%2Fos-windows.h;h=3e9f73413b26a5f2c5e778b63df4281f2e7df994;hp=f5da6a5d583d53c737b3529a596f50e177f5f7d7;hb=ce4d13ca162df4127ec3b5911553802c53396705;hpb=03e20d687566753b90383571e5e152c5142bdffd diff --git a/os/os-windows.h b/os/os-windows.h index f5da6a5d..3e9f7341 100644 --- a/os/os-windows.h +++ b/os/os-windows.h @@ -1,104 +1,206 @@ -#ifndef FIO_OS_WINDOWS_H -#define FIO_OS_WINDOWS_H - - -#include -#include - - -#define FIO_HAVE_ODIRECT -#define FIO_USE_GENERIC_RAND -#define FIO_HAVE_CHARDEV_SIZE -#define FIO_USE_GENERIC_RAND - -#define FIO_HAVE_FALLOCATE -#define FIO_HAVE_FDATASYNC -#define FIO_HAVE_WINDOWSAIO - -/* TODO add support for FIO_HAVE_CPU_AFFINITY */ - -#define OS_MAP_ANON MAP_ANON - -typedef off_t off64_t; - - -#define FIO_NOTUNIX - -#include -#include - -typedef void* HANDLE; - -BOOL WINAPI GetFileSizeEx( - HANDLE hFile, - PLARGE_INTEGER lpFileSize -); - -long _get_osfhandle( - int fd -); - -typedef struct { - LARGE_INTEGER Length; -} GET_LENGTH_INFORMATION; - -#define IOCTL_DISK_GET_LENGTH_INFO 0x7405C - - -static inline int blockdev_size(int fd, unsigned long long *bytes) -{ - int rc = 0; - HANDLE hFile = (HANDLE)_get_osfhandle(fd); - if (hFile != INVALID_HANDLE_VALUE) - { - GET_LENGTH_INFORMATION info; - DWORD outBytes; - LARGE_INTEGER size; - size.QuadPart = 0; - if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL)) - *bytes = info.Length.QuadPart; - else - rc = EIO; - } - - return 0; -} - -static inline int chardev_size(int fd, unsigned long long *bytes) -{ - return blockdev_size(fd, bytes); -} - -static inline int blockdev_invalidate_cache(int fd) -{ - int rc = 0; - HANDLE hFile = (HANDLE)_get_osfhandle(fd); - - if (hFile != INVALID_HANDLE_VALUE) - FlushFileBuffers(hFile); - else - rc = EIO; - - return rc; -} - -static inline unsigned long long os_phys_mem(void) -{ - SYSTEM_INFO sysInfo; - unsigned long addr; - GetSystemInfo(&sysInfo); - addr = (unsigned long)sysInfo.lpMaximumApplicationAddress; - return addr; -} - -static inline void os_get_tmpdir(char *path, int len) -{ - GetTempPath(len, path); -} - -#ifdef MADV_FREE -#define FIO_MADV_FREE MADV_FREE -#endif - - -#endif /* FIO_OS_WINDOWS_H */ +#ifndef FIO_OS_WINDOWS_H +#define FIO_OS_WINDOWS_H + +#define FIO_OS os_windows + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../smalloc.h" +#include "../debug.h" +#include "../file.h" +#include "../log.h" +#include "../lib/hweight.h" +#include "../oslib/strcasestr.h" +#include "../lib/types.h" + +#include "windows/posix.h" + +/* MinGW won't declare rand_r unless _POSIX is defined */ +#if defined(WIN32) && !defined(rand_r) +int rand_r(unsigned *); +#endif + +#ifndef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 65535 +#endif + +#define FIO_HAVE_ODIRECT +#define FIO_HAVE_CPU_AFFINITY +#define FIO_HAVE_CHARDEV_SIZE +#define FIO_HAVE_GETTID + +#define FIO_PREFERRED_ENGINE "windowsaio" +#define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME +#define FIO_OS_PATH_SEPARATOR '\\' + +#define OS_MAP_ANON MAP_ANON + +#define fio_swap16(x) _byteswap_ushort(x) +#define fio_swap32(x) _byteswap_ulong(x) +#define fio_swap64(x) _byteswap_uint64(x) + +#define _SC_PAGESIZE 0x1 +#define _SC_NPROCESSORS_ONLN 0x2 +#define _SC_PHYS_PAGES 0x4 + +#define SA_RESTART 0 +#define SIGPIPE 0 + +/* + * Windows doesn't have O_DIRECT or O_SYNC, so define them + * here so we can reject them at runtime when using the _open + * interface (windowsaio uses CreateFile) + */ +#define O_DIRECT 0x1000000 +#define O_SYNC 0x2000000 + +/* Windows doesn't support madvise, so any values will work */ +#define POSIX_MADV_DONTNEED 0 +#define POSIX_MADV_SEQUENTIAL 0 +#define POSIX_MADV_RANDOM 0 + +#define F_SETFL 0x1 +#define F_GETFL 0x2 +#define O_NONBLOCK FIONBIO + +/* Winsock doesn't support MSG_WAIT */ +#define OS_MSG_DONTWAIT 0 + +#ifndef S_ISSOCK +#define S_ISSOCK(x) 0 +#endif + +#define SIGCONT 0 +#define SIGUSR1 1 +#define SIGUSR2 2 + +typedef int sigset_t; +typedef int siginfo_t; + +struct sigaction +{ + void (*sa_handler)(int); + sigset_t sa_mask; + int sa_flags; + void* (*sa_sigaction)(int, siginfo_t *, void*); +}; + +long sysconf(int name); + +int kill(pid_t pid, int sig); +pid_t setsid(void); +int setgid(gid_t gid); +int setuid(uid_t uid); +int nice(int incr); +int sigaction(int sig, const struct sigaction *act, + struct sigaction *oact); +int fsync(int fildes); +int fork(void); +int fcntl(int fildes, int cmd, ...); +int fdatasync(int fildes); +int lstat(const char * path, struct stat * buf); +uid_t geteuid(void); +char* ctime_r(const time_t *t, char *buf); +int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); +ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset); +ssize_t pwrite(int fildes, const void *buf, size_t nbyte, + off_t offset); + +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) +{ + int rc = 0; + HANDLE hFile; + GET_LENGTH_INFORMATION info; + DWORD outBytes; + + if (f->hFile == NULL) { + hFile = CreateFile(f->file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, NULL); + } else { + hFile = f->hFile; + } + + if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL)) + *bytes = info.Length.QuadPart; + else + rc = EIO; + + /* If we were passed a POSIX fd, + * close the HANDLE we created via CreateFile */ + if (hFile != INVALID_HANDLE_VALUE && f->hFile == NULL) + CloseHandle(hFile); + + return rc; +} + +static inline int chardev_size(struct fio_file *f, unsigned long long *bytes) +{ + return blockdev_size(f, bytes); +} + +static inline int blockdev_invalidate_cache(struct fio_file *f) +{ + return ENOTSUP; +} + +static inline unsigned long long os_phys_mem(void) +{ + long pagesize, pages; + + pagesize = sysconf(_SC_PAGESIZE); + pages = sysconf(_SC_PHYS_PAGES); + if (pages == -1 || pagesize == -1) + return 0; + + return (unsigned long long) pages * (unsigned long long) pagesize; +} + +#ifndef CONFIG_HAVE_GETTID +static inline int gettid(void) +{ + return GetCurrentThreadId(); +} +#endif + +static inline int init_random_seeds(uint64_t *rand_seeds, int size) +{ + HCRYPTPROV hCryptProv; + + if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + { + errno = GetLastError(); + log_err("CryptAcquireContext() failed: error %d\n", errno); + return 1; + } + + if (!CryptGenRandom(hCryptProv, size, (BYTE*)rand_seeds)) { + errno = GetLastError(); + log_err("CryptGenRandom() failed, error %d\n", errno); + CryptReleaseContext(hCryptProv, 0); + return 1; + } + + CryptReleaseContext(hCryptProv, 0); + return 0; +} + +static inline int fio_set_sched_idle(void) +{ + /* SetThreadPriority returns nonzero for success */ + return (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE))? 0 : -1; +} + +#ifdef CONFIG_WINDOWS_XP +#include "os-windows-xp.h" +#else +#include "os-windows-7.h" +#endif + +#endif /* FIO_OS_WINDOWS_H */