X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=os%2Fos-mac.h;h=553f82007fae7c23a83a5b89ac77108907e2cb18;hp=1a0a8875fc090742212012356393ee5baacb283d;hb=93bcfd20e37cef8cec350fe06d3a086724c9f257;hpb=9b8365618309572d8fd2579c8ea3132db89f843f diff --git a/os/os-mac.h b/os/os-mac.h index 1a0a8875..553f8200 100644 --- a/os/os-mac.h +++ b/os/os-mac.h @@ -1,11 +1,18 @@ #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 #include "../file.h" @@ -19,11 +26,31 @@ #define FIO_HAVE_POSIXAIO #define FIO_HAVE_CLOCK_MONOTONIC -#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 OS_MAP_ANON MAP_ANON +#if defined(__LITTLE_ENDIAN__) +#define FIO_LITTLE_ENDIAN +#elif defined(__BIG_ENDIAN__) +#define FIO_BIG_ENDIAN +#else +#error "Undefined byte order" +#endif + +#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; /* OS X as of 10.6 doesn't have the timer_* functions. @@ -43,17 +70,6 @@ struct itimerspec { static struct sigevent fio_timers[MAX_TIMERS]; static unsigned int num_timers = 0; -static inline int timer_create(clockid_t clockid, struct sigevent *restrict evp, - timer_t *restrict timerid) -{ - int current_timer = num_timers; - fio_timers[current_timer] = *evp; - num_timers++; - - *timerid = current_timer; - return 0; -} - static void sig_alrm(int signum) { union sigval sv; @@ -70,7 +86,8 @@ static void sig_alrm(int signum) } static inline int timer_settime(timer_t timerid, int flags, - const struct itimerspec *value, struct itimerspec *ovalue) + const struct itimerspec *value, + struct itimerspec *ovalue) { struct sigaction sa; struct itimerval tv; @@ -107,6 +124,42 @@ static inline int timer_delete(timer_t timer) return 0; } +#define FIO_OS_DIRECTIO +static inline int fio_set_odirect(int fd) +{ + if (fcntl(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(struct fio_file *f) { return EINVAL; @@ -121,4 +174,9 @@ static inline unsigned long long os_phys_mem(void) sysctl(mib, 2, &mem, &len, NULL, 0); return mem; } + +static inline int gettid(void) +{ + return mach_thread_self(); +} #endif