X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=os%2Fos-mac.h;h=a073300c40c5ed6fea8c2ec2ff4933776ef7066d;hb=f6abd73197dd534a4944eabfdd11f5104fcf9409;hp=1c3798bfb56f8c52fbd166f60dbb6ce80cb1ad9b;hpb=535313705d69dc16f27ca38acf2f9bf7205e410d;p=fio.git diff --git a/os/os-mac.h b/os/os-mac.h index 1c3798bf..a073300c 100644 --- a/os/os-mac.h +++ b/os/os-mac.h @@ -1,29 +1,83 @@ #ifndef FIO_OS_APPLE_H #define FIO_OS_APPLE_H +#define FIO_OS os_mac + #include +#include +#include #include +#include +#include +#include +#include +#include +#include -#ifndef CLOCK_MONOTONIC -#define CLOCK_MONOTONIC 1 -#endif - -#ifndef CLOCK_REALTIME -#define CLOCK_REALTIME 1 -#endif +#include "../file.h" -#define FIO_HAVE_POSIXAIO -#define FIO_USE_GENERIC_BDEV_SIZE -#define FIO_USE_GENERIC_RAND +#define FIO_USE_GENERIC_INIT_RANDOM_STATE +#define FIO_HAVE_GETTID +#define FIO_HAVE_CHARDEV_SIZE +#define FIO_HAVE_NATIVE_FALLOCATE #define OS_MAP_ANON MAP_ANON -typedef unsigned long os_cpu_mask_t; +#define fio_swap16(x) OSSwapInt16(x) +#define fio_swap32(x) OSSwapInt32(x) +#define fio_swap64(x) OSSwapInt64(x) + +/* + * OSX has a pitifully small shared memory segment by default, + * so default to a lower number of max jobs supported + */ +#define FIO_MAX_JOBS 128 + +typedef off_t off64_t; + +#ifndef CONFIG_CLOCKID_T typedef unsigned int clockid_t; +#endif + +#define FIO_OS_DIRECTIO +static inline int fio_set_odirect(struct fio_file *f) +{ + if (fcntl(f->fd, F_NOCACHE, 1) == -1) + return errno; + return 0; +} + +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) +{ + uint32_t block_size; + uint64_t block_count; + + if (ioctl(f->fd, DKIOCGETBLOCKCOUNT, &block_count) == -1) + return errno; + if (ioctl(f->fd, DKIOCGETBLOCKSIZE, &block_size) == -1) + return errno; + + *bytes = block_size; + *bytes *= block_count; + return 0; +} + +static inline int chardev_size(struct fio_file *f, unsigned long long *bytes) +{ + /* + * Could be a raw block device, this is better than just assuming + * we can't get the size at all. + */ + if (!blockdev_size(f, bytes)) + return 0; + + *bytes = -1ULL; + return 0; +} -static inline int blockdev_invalidate_cache(int fd) +static inline int blockdev_invalidate_cache(struct fio_file *f) { - return EINVAL; + return ENOTSUP; } static inline unsigned long long os_phys_mem(void) @@ -35,4 +89,29 @@ static inline unsigned long long os_phys_mem(void) sysctl(mib, 2, &mem, &len, NULL, 0); return mem; } + +#ifndef CONFIG_HAVE_GETTID +static inline int gettid(void) +{ + return mach_thread_self(); +} +#endif + +/* + * For some reason, there's no header definition for fdatasync(), even + * if it exists. + */ +extern int fdatasync(int fd); + +static inline bool fio_fallocate(struct fio_file *f, uint64_t offset, uint64_t len) +{ + fstore_t store = {F_ALLOCATEALL, F_PEOFPOSMODE, offset, len}; + if (fcntl(f->fd, F_PREALLOCATE, &store) != -1) { + if (ftruncate(f->fd, len) == 0) + return true; + } + + return false; +} + #endif