Signed-off-by: Elad Lahav <e2lahav@xxxxxxxxx> --- CodeSamples/Makefile | 4 ++- CodeSamples/api-pthreads/api-linux.h | 36 ++++++++++++++++++++++++ CodeSamples/api-pthreads/api-pthreads.h | 13 --------- CodeSamples/api-pthreads/api-qnx.h | 37 +++++++++++++++++++++++++ CodeSamples/arch-arm64/arch-arm64.h | 4 +++ CodeSamples/depends.mk | 29 ++++++++++++++++++- 6 files changed, 108 insertions(+), 15 deletions(-) create mode 100644 CodeSamples/api-pthreads/api-linux.h create mode 100644 CodeSamples/api-pthreads/api-qnx.h diff --git a/CodeSamples/Makefile b/CodeSamples/Makefile index 3a96f5cf..38143638 100644 --- a/CodeSamples/Makefile +++ b/CodeSamples/Makefile @@ -38,10 +38,12 @@ endif sed '/end{snippet}/d' >> api.h echo "" >> api.h cat api-pthreads/api-gcc.h >> api.h + cat api-pthreads/api-$(os_compat).h >> api.h echo "" >> api.h if test -f /usr/include/urcu-call-rcu.h -o \ -f /usr/local/include/urcu-call-rcu.h -o \ - -f /usr/include/$(subdir_ub)/urcu-call-rcu.h ; \ + -f /usr/include/$(subdir_ub)/urcu-call-rcu.h -o \ + -f $(QNX_TARGET)/usr/include/urcu-call-rcu.h ; \ then \ echo "#define _LGPL_SOURCE" >> api.h; \ echo "#include <urcu/rculist.h>" >> api.h; \ diff --git a/CodeSamples/api-pthreads/api-linux.h b/CodeSamples/api-pthreads/api-linux.h new file mode 100644 index 00000000..03522a54 --- /dev/null +++ b/CodeSamples/api-pthreads/api-linux.h @@ -0,0 +1,36 @@ +/* + * api-linux.h: Linux-specific functions + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. However, please note that much + * of the code in this file derives from the Linux kernel, and that such + * code may not be available except under GPLv2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * Copyright (c) 2006-2019 Paul E. McKenney, IBM. + * Copyright (c) 2019 Paul E. McKenney, Facebook. + */ + +static __inline__ void run_on(int cpu) +{ + cpu_set_t mask; + int ret; + + CPU_ZERO(&mask); + CPU_SET(cpu, &mask); + ret = sched_setaffinity(0, sizeof(mask), &mask); + if (ret) { + perror("sched_setaffinity"); + abort(); + } +} diff --git a/CodeSamples/api-pthreads/api-pthreads.h b/CodeSamples/api-pthreads/api-pthreads.h index 44e55c0d..3e21fdb9 100644 --- a/CodeSamples/api-pthreads/api-pthreads.h +++ b/CodeSamples/api-pthreads/api-pthreads.h @@ -308,19 +308,6 @@ static __inline__ void waitall(void) } // \end{snippet} -static __inline__ void run_on(int cpu) -{ - cpu_set_t mask; - int ret; - - CPU_ZERO(&mask); - CPU_SET(cpu, &mask); - ret = sched_setaffinity(0, sizeof(mask), &mask); - if (ret) { - perror("sched_setaffinity"); - abort(); - } -} /* * Timekeeping, using monotonic globally coherent clock. diff --git a/CodeSamples/api-pthreads/api-qnx.h b/CodeSamples/api-pthreads/api-qnx.h new file mode 100644 index 00000000..ed2fb543 --- /dev/null +++ b/CodeSamples/api-pthreads/api-qnx.h @@ -0,0 +1,37 @@ +/* + * api-qnx.h: QNX-specific functions + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. However, please note that much + * of the code in this file derives from the Linux kernel, and that such + * code may not be available except under GPLv2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you can access it online at + * http://www.gnu.org/licenses/gpl-2.0.html. + * + * Copyright (c) 2022 Elad Lahav + */ + +#include <stdint.h> +#include <sys/neutrino.h> + +static inline void run_on(int cpu) +{ + uintptr_t runmask; + int ret; + + runmask = (1UL << cpu); + ret = ThreadCtl(_NTO_TCTL_RUNMASK, (void *)runmask); + if (ret) { + perror("sched_setaffinity"); + abort(); + } +} diff --git a/CodeSamples/arch-arm64/arch-arm64.h b/CodeSamples/arch-arm64/arch-arm64.h index 0e724740..f45d8bdc 100644 --- a/CodeSamples/arch-arm64/arch-arm64.h +++ b/CodeSamples/arch-arm64/arch-arm64.h @@ -46,6 +46,10 @@ #include <stdlib.h> #include <time.h> +#ifndef CLOCK_MONOTONIC_RAW +#define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC +#endif + /* * Generate 64-bit timestamp. */ diff --git a/CodeSamples/depends.mk b/CodeSamples/depends.mk index a6db993f..30810339 100644 --- a/CodeSamples/depends.mk +++ b/CodeSamples/depends.mk @@ -1,7 +1,13 @@ ifeq ($(strip $(arch)),) -arch := $(shell uname -m) +arch := $(shell uname -p) endif +ifeq ($(strip $(os)),) +os := $(shell uname) +endif + +ifeq ($(os),Linux) +# Linux ifeq ($(arch),i686) target := x86 subdir_ub := i386-linux-gnu @@ -23,6 +29,27 @@ subdir_ub := arm-linux-gnueabihf else target := subdir_ub := +endif +os_compat := linux + +else ifeq ($(os),QNX) +# QNX +ifeq ($(arch),x86_64) +target := x86 +else ifeq ($(arch),aarch64le) +target := arm64 +else +target := +endif +subdir_ub := +os_compat := qnx + +else +# Other OS +target := +subdir_ub := +os_compat := + endif api_depend_common := $(top)/linux/common.h \ -- 2.25.1