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 #1785

Closed
wants to merge 2 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
6 changes: 6 additions & 0 deletions init.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,14 @@

#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
97 changes: 97 additions & 0 deletions os/os-qnx.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#ifndef FIO_OS_QNX_H
#define FIO_OS_QNX_H

#define FIO_OS os_qnx
#include <stdint.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/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"

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
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
10 changes: 10 additions & 0 deletions server.c
Original file line number Diff line number Diff line change
Expand Up @@ -2742,7 +2742,17 @@ static void set_sig_handlers(void)
{
struct sigaction act = {
.sa_handler = sig_int,
#if defined(__QNX__)
<<<<<<< HEAD
act.sa_flags = SA_NOCLDSTOP,
#else
act.sa_flags = SA_RESTART,
=======
.sa_flags = SA_NOCLDSTOP,
#else
.sa_flags = SA_RESTART,
>>>>>>> Support platform QNX OS
#endif
};

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