X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=os%2Fos-mac.h;h=7de36ea79aa7b43a7f962796526cf000a2458527;hp=1a0a8875fc090742212012356393ee5baacb283d;hb=68bf62a07c0d00c97a0600ce9664b92378a95a91;hpb=7ed4d7abf0d7720d532d9680ebf69745d9270a5e diff --git a/os/os-mac.h b/os/os-mac.h index 1a0a8875..7de36ea7 100644 --- a/os/os-mac.h +++ b/os/os-mac.h @@ -1,115 +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 #include "../file.h" -#ifndef CLOCK_MONOTONIC -#define CLOCK_MONOTONIC 1 -#endif - -#ifndef CLOCK_REALTIME -#define CLOCK_REALTIME 1 -#endif - -#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 -typedef off_t off64_t; +#define fio_swap16(x) OSSwapInt16(x) +#define fio_swap32(x) OSSwapInt32(x) +#define fio_swap64(x) OSSwapInt64(x) -/* OS X as of 10.6 doesn't have the timer_* functions. - * Emulate the functionality using setitimer and sigaction here +/* + * 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 -#define MAX_TIMERS 64 +typedef off_t off64_t; +#ifndef CONFIG_CLOCKID_T typedef unsigned int clockid_t; -typedef unsigned int timer_t; - -struct itimerspec { - struct timespec it_value; - struct timespec it_interval; -}; - -static struct sigevent fio_timers[MAX_TIMERS]; -static unsigned int num_timers = 0; +#endif -static inline int timer_create(clockid_t clockid, struct sigevent *restrict evp, - timer_t *restrict timerid) +#define FIO_OS_DIRECTIO +static inline int fio_set_odirect(int fd) { - int current_timer = num_timers; - fio_timers[current_timer] = *evp; - num_timers++; - - *timerid = current_timer; + if (fcntl(fd, F_NOCACHE, 1) == -1) + return errno; return 0; } -static void sig_alrm(int signum) +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) { - union sigval sv; - - for (int i = 0; i < num_timers; i++) { - if (fio_timers[i].sigev_notify_function == NULL) - continue; - - if (fio_timers[i].sigev_notify == SIGEV_THREAD) - fio_timers[i].sigev_notify_function(sv); - else if (fio_timers[i].sigev_notify == SIGEV_SIGNAL) - kill(getpid(), fio_timers[i].sigev_signo); - } -} + uint32_t block_size; + uint64_t block_count; -static inline int timer_settime(timer_t timerid, int flags, - const struct itimerspec *value, struct itimerspec *ovalue) -{ - struct sigaction sa; - struct itimerval tv; - struct itimerval tv_out; - int rc; - - tv.it_interval.tv_sec = value->it_interval.tv_sec; - tv.it_interval.tv_usec = value->it_interval.tv_nsec / 1000; - - tv.it_value.tv_sec = value->it_value.tv_sec; - tv.it_value.tv_usec = value->it_value.tv_nsec / 1000; - - sa.sa_handler = sig_alrm; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - - rc = sigaction(SIGALRM, &sa, NULL); - - if (!rc) - rc = setitimer(ITIMER_REAL, &tv, &tv_out); - - if (!rc && ovalue != NULL) { - ovalue->it_interval.tv_sec = tv_out.it_interval.tv_sec; - ovalue->it_interval.tv_nsec = tv_out.it_interval.tv_usec * 1000; - ovalue->it_value.tv_sec = tv_out.it_value.tv_sec; - ovalue->it_value.tv_nsec = tv_out.it_value.tv_usec * 1000; - } - - return rc; + 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 timer_delete(timer_t timer) +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; + return ENOTSUP; } static inline unsigned long long os_phys_mem(void) @@ -121,4 +89,16 @@ 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(); +} + +/* + * For some reason, there's no header definition for fdatasync(), even + * if it exists. + */ +extern int fdatasync(int fd); + #endif