Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support platform QNX OS #1786

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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);
}
}
Expand Down
12 changes: 12 additions & 0 deletions client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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);
}

Expand Down
6 changes: 6 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1090,6 +1095,7 @@ if test "$have_vasprintf" != "yes" ; then
fi
cat > $TMPC << EOF
#include <stdio.h>
#include <stdarg.h>
int main(int argc, char **argv)
{
Expand Down
1 change: 1 addition & 0 deletions engines/e4defrag.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdint.h>

#include "../fio.h"
#include "../optgroup.h"
Expand Down
8 changes: 8 additions & 0 deletions init.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,16 @@

#include "fio.h"
#ifndef FIO_NO_HAVE_SHM_H
#if defined(__QNX__)
#include <sys/mman.h>
#else
#include <sys/shm.h>
#endif
#endif





#include "parse.h"
#include "smalloc.h"
Expand Down
4 changes: 4 additions & 0 deletions memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@

#include "fio.h"
#ifndef FIO_NO_HAVE_SHM_H
#if defined(__QNX__)
#include <sys/mman.h>
#else
#include <sys/shm.h>
#endif
#endif

void fio_unpin_memory(struct thread_data *td)
{
Expand Down
110 changes: 110 additions & 0 deletions os/os-qnx.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#ifndef FIO_OS_QNX_H
#define FIO_OS_QNX_H

#define FIO_OS os_qnx
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#include <sys/param.h>
#include <sys/statvfs.h>
#include <sys/ioctl.h>
#include <sys/utsname.h>
#include <sys/sysctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dcmd_cam.h>

/* XXX hack to avoid conflicts between rbtree.h and <sys/tree.h> */
#undef RB_BLACK
#undef RB_RED
#undef RB_ROOT

#include "../file.h"

/* QNX is not supporting SA_RESTART. Use SA_NOCLDSTOP instead of it */
#ifndef SA_RESTART
#define SA_RESTART SA_NOCLDSTOP
#endif

#define FIO_NO_HAVE_SHM_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 stat statbuf, *pstat;
pstat = &statbuf;
if ( fstat(f->fd, pstat ) == -1 ) {
perror( "fstat" );
} else {
*bytes = (unsigned long long)(pstat->st_blocksize * pstat->st_nblocks);
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
4 changes: 3 additions & 1 deletion os/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ enum {
os_windows,
os_android,
os_dragonfly,

os_qnx,
os_nr,
};

Expand All @@ -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__)
Expand Down
4 changes: 3 additions & 1 deletion oslib/inet_aton.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
#define FIO_INET_ATON_LIB_H

#include <arpa/inet.h>

#if defined(__QNX__)
#include <sys/socket.h>
#endif
int inet_aton(const char *cp, struct in_addr *inp);

#endif
4 changes: 4 additions & 0 deletions server.c
Original file line number Diff line number Diff line change
Expand Up @@ -2742,7 +2742,11 @@ static void set_sig_handlers(void)
{
struct sigaction act = {
.sa_handler = sig_int,
#if defined(__QNX__)
.sa_flags = SA_NOCLDSTOP,
#else
.sa_flags = SA_RESTART,
#endif
};

sigaction(SIGINT, &act, NULL);
Expand Down