/* * Copyright (C) 2015 Philippe Gerum . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _BOILERPLATE_TUNABLES_H #define _BOILERPLATE_TUNABLES_H #include #include #ifdef __cplusplus extern "C" { #endif static inline int __may_change_config_tunable(void) { return !__config_done; } #define __tunable_set_call(__name, __scope) \ __assign_ ## __name ## _ ## __scope #define __tunable_get_call(__name, __scope) \ __read_ ## __name ## _ ## __scope #define __define_tunable(__name, __type, __val, __scope) \ void __tunable_set_call(__name, __scope)(__typeof__(__type) __val) #define __read_tunable(__name, __type, __scope) \ __typeof__(__type) __tunable_get_call(__name, __scope)(void) #define define_config_tunable(__name, __type, __val) \ __define_tunable(__name, __type, __val, config) #define define_runtime_tunable(__name, __type, __val) \ __define_tunable(__name, __type, __val, runtime) #define read_config_tunable(__name, __type) \ __read_tunable(__name, __type, config) #define read_runtime_tunable(__name, __type) \ __read_tunable(__name, __type, runtime) #define set_config_tunable(__name, __val) \ do { \ assert(__may_change_config_tunable()); \ __tunable_set_call(__name, config)(__val); \ } while (0) #define get_config_tunable(__name) \ __tunable_get_call(__name, config)() #define set_runtime_tunable(__name, __val) \ __tunable_set_call(__name, runtime)(__val) #define get_runtime_tunable(__name) \ __tunable_get_call(__name, runtime)() static inline define_config_tunable(cpu_affinity, cpu_set_t, cpus) { __base_setup_data.cpu_affinity = cpus; } static inline read_config_tunable(cpu_affinity, cpu_set_t) { return __base_setup_data.cpu_affinity; } static inline define_config_tunable(no_mlock, int, nolock) { __base_setup_data.no_mlock = nolock; } static inline read_config_tunable(no_mlock, int) { return __base_setup_data.no_mlock; } static inline define_config_tunable(no_sanity, int, nosanity) { __base_setup_data.no_sanity = nosanity; } static inline read_config_tunable(no_sanity, int) { return __base_setup_data.no_sanity; } static inline define_runtime_tunable(verbosity_level, int, level) { __base_setup_data.verbosity_level = level; } static inline read_runtime_tunable(verbosity_level, int) { return __base_setup_data.verbosity_level; } static inline define_runtime_tunable(trace_level, int, level) { __base_setup_data.trace_level = level; } static inline read_runtime_tunable(trace_level, int) { return __base_setup_data.trace_level; } #ifdef __cplusplus } #endif #endif /* !_BOILERPLATE_TUNABLES_H */