diff --git a/backend.c b/backend.c index fe03eab38..f6648dbf4 100644 --- a/backend.c +++ b/backend.c @@ -118,12 +118,20 @@ static void set_sig_handlers(void) memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGINT, &act, NULL); memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGTERM, &act, NULL); /* Windows uses SIGBREAK as a quit signal from other applications */ @@ -136,13 +144,21 @@ static void set_sig_handlers(void) memset(&act, 0, sizeof(act)); act.sa_handler = sig_show_status; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGUSR1, &act, NULL); if (is_backend) { memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGPIPE, &act, NULL); } } diff --git a/client.c b/client.c index 4cb7dffed..227a875cb 100644 --- a/client.c +++ b/client.c @@ -652,12 +652,20 @@ static void client_signal_handler(void) memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGINT, &act, NULL); memset(&act, 0, sizeof(act)); act.sa_handler = sig_int; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGTERM, &act, NULL); /* Windows uses SIGBREAK as a quit signal from other applications */ @@ -670,7 +678,11 @@ static void client_signal_handler(void) memset(&act, 0, sizeof(act)); act.sa_handler = sig_show_status; + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP; + #else act.sa_flags = SA_RESTART; + #endif sigaction(SIGUSR1, &act, NULL); } diff --git a/configure b/configure index 3eef022b9..f3cb18a0c 100755 --- a/configure +++ b/configure @@ -366,6 +366,8 @@ elif check_define __sun__ ; then CFLAGS="$CFLAGS -D_REENTRANT" elif check_define _WIN32 ; then targetos='CYGWIN' +elif check_define __QNX__ ; then + targetos='QNX' else targetos=`uname -s` fi @@ -466,6 +468,9 @@ CYGWIN*) pthread_condattr_setclock="no" pthread_affinity="no" ;; +QNX) + LIBS="-lsocket" + ;; esac # Now we know the target platform we can have another guess at the preferred @@ -1090,6 +1095,7 @@ if test "$have_vasprintf" != "yes" ; then fi cat > $TMPC << EOF #include +#include int main(int argc, char **argv) { diff --git a/engines/e4defrag.c b/engines/e4defrag.c index 37cc2ada8..65ef0da70 100644 --- a/engines/e4defrag.c +++ b/engines/e4defrag.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "../fio.h" #include "../optgroup.h" diff --git a/init.c b/init.c index ff3e9a90d..7961a4130 100644 --- a/init.c +++ b/init.c @@ -18,8 +18,14 @@ #include "fio.h" #ifndef FIO_NO_HAVE_SHM_H +#if defined(__QNX__) +#include +#else #include #endif +#endif + + #include "parse.h" #include "smalloc.h" diff --git a/memory.c b/memory.c index 2fdca6576..537456c82 100644 --- a/memory.c +++ b/memory.c @@ -8,8 +8,12 @@ #include "fio.h" #ifndef FIO_NO_HAVE_SHM_H +#if defined(__QNX__) +#include +#else #include #endif +#endif void fio_unpin_memory(struct thread_data *td) { diff --git a/os/os-qnx.h b/os/os-qnx.h new file mode 100755 index 000000000..d7b30ad4f --- /dev/null +++ b/os/os-qnx.h @@ -0,0 +1,97 @@ +#ifndef FIO_OS_QNX_H +#define FIO_OS_QNX_H + +#define FIO_OS os_qnx +#include +#include +#include +#include +#include +#include +#include +#include + +/* XXX hack to avoid conflicts between rbtree.h and */ +#undef RB_BLACK +#undef RB_RED +#undef RB_ROOT + +#include "../file.h" + +typedef uint64_t __u64; +typedef unsigned int __u32; + +#define FIO_USE_GENERIC_INIT_RANDOM_STATE +#define FIO_HAVE_FS_STAT +#define FIO_HAVE_GETTID + +#define OS_MAP_ANON MAP_ANON + +#ifndef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 4096 +#endif + +#define fio_swap16(x) swap16(x) +#define fio_swap32(x) swap32(x) +#define fio_swap64(x) swap64(x) + +#ifdef CONFIG_PTHREAD_GETAFFINITY +#define FIO_HAVE_GET_THREAD_AFFINITY +#define fio_get_thread_affinity(mask) \ + pthread_getaffinity_np(pthread_self(), sizeof(mask), &(mask)) +#endif + +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) +{ + + struct cam_devinfo cam; + if (devctl(f->fd, DCMD_CAM_DEVINFO, &cam, sizeof(cam), NULL) == EOK) { + *bytes = cam.num_sctrs * 512; + return 0; + } + + *bytes = 0; + return errno; +} + +static inline int blockdev_invalidate_cache(struct fio_file *f) +{ + return ENOTSUP; +} + +static inline unsigned long long os_phys_mem(void) +{ + int mib[2] = { CTL_HW, HW_PHYSMEM64 }; + uint64_t mem; + size_t len = sizeof(mem); + + sysctl(mib, 2, &mem, &len, NULL, 0); + return mem; +} + +#ifndef CONFIG_HAVE_GETTID +#error +static inline int gettid(void) +{ + return (int)(intptr_t) pthread_self(); +} +#endif + +static inline unsigned long long get_fs_free_size(const char *path) +{ + unsigned long long ret; + struct statvfs s; + + if (statvfs(path, &s) < 0) + return -1ULL; + + ret = s.f_frsize; + ret *= (unsigned long long) s.f_bfree; + return ret; +} + +#ifdef MADV_FREE +#define FIO_MADV_FREE MADV_FREE +#endif + +#endif diff --git a/os/os.h b/os/os.h index 0f1823240..45c2f1e98 100644 --- a/os/os.h +++ b/os/os.h @@ -24,7 +24,7 @@ enum { os_windows, os_android, os_dragonfly, - + os_qnx, os_nr, }; @@ -39,6 +39,8 @@ typedef enum { #include "os-freebsd.h" #elif defined(__OpenBSD__) #include "os-openbsd.h" +#elif defined(__QNX__) +#include "os-qnx.h" #elif defined(__NetBSD__) #include "os-netbsd.h" #elif defined(__sun__) diff --git a/oslib/inet_aton.h b/oslib/inet_aton.h index c93c87f86..4f3a48d22 100644 --- a/oslib/inet_aton.h +++ b/oslib/inet_aton.h @@ -2,7 +2,9 @@ #define FIO_INET_ATON_LIB_H #include - +#if defined(__QNX__) +#include +#endif int inet_aton(const char *cp, struct in_addr *inp); #endif diff --git a/server.c b/server.c index afaeb3482..2d9121952 100644 --- a/server.c +++ b/server.c @@ -2742,7 +2742,11 @@ static void set_sig_handlers(void) { struct sigaction act = { .sa_handler = sig_int, - .sa_flags = SA_RESTART, + #if defined(__QNX__) + act.sa_flags = SA_NOCLDSTOP, + #else + act.sa_flags = SA_RESTART, + #endif }; sigaction(SIGINT, &act, NULL);