18 #ifndef _XENOMAI_SMOKEY_SMOKEY_H 19 #define _XENOMAI_SMOKEY_SMOKEY_H 23 #include <boilerplate/list.h> 24 #include <boilerplate/libc.h> 25 #include <copperplate/clockobj.h> 26 #include <xenomai/init.h> 34 #define SMOKEY_INT(__name) { \ 36 .parser = smokey_int, \ 40 #define SMOKEY_BOOL(__name) { \ 42 .parser = smokey_bool, \ 46 #define SMOKEY_STRING(__name) { \ 48 .parser = smokey_string, \ 52 #define SMOKEY_SIZE(__name) { \ 54 .parser = smokey_size, \ 58 #define SMOKEY_ARGLIST(__args...) ((struct smokey_arg[]){ __args }) 60 #define SMOKEY_NOARGS (((struct smokey_arg[]){ { .name = NULL } })) 64 int (*parser)(
const char *s,
65 struct smokey_arg *arg);
76 struct smokey_arg *args;
78 const char *description;
79 int (*run)(
struct smokey_test *t,
80 int argc,
char *
const argv[]);
87 #define for_each_smokey_test(__pos) \ 88 pvlist_for_each_entry((__pos), &smokey_test_list, __reserved.next) 90 #define __smokey_arg_count(__args) \ 91 (sizeof(__args) / sizeof(__args[0])) 93 #define smokey_test_plugin(__plugin, __args, __desc) \ 94 static int run_ ## __plugin(struct smokey_test *t, \ 95 int argc, char *const argv[]); \ 96 static struct smokey_test __plugin = { \ 99 .nargs = __smokey_arg_count(__args), \ 100 .description = (__desc), \ 101 .run = run_ ## __plugin, \ 103 __early_ctor void smokey_plugin_ ## __plugin(void); \ 104 void smokey_plugin_ ## __plugin(void) \ 106 smokey_register_plugin(&(__plugin)); \ 109 #define SMOKEY_ARG(__plugin, __arg) (smokey_lookup_arg(&(__plugin), # __arg)) 110 #define SMOKEY_ARG_ISSET(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->matched) 111 #define SMOKEY_ARG_INT(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.n_val) 112 #define SMOKEY_ARG_BOOL(__plugin, __arg) (!!SMOKEY_ARG_INT(__plugin, __arg)) 113 #define SMOKEY_ARG_STRING(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.s_val) 114 #define SMOKEY_ARG_SIZE(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.l_val) 116 #define smokey_arg_isset(__t, __name) (smokey_lookup_arg(__t, __name)->matched) 117 #define smokey_arg_int(__t, __name) (smokey_lookup_arg(__t, __name)->u.n_val) 118 #define smokey_arg_bool(__t, __name) (!!smokey_arg_int(__t, __name)) 119 #define smokey_arg_string(__t, __name) (smokey_lookup_arg(__t, __name)->u.s_val) 120 #define smokey_arg_size(__t, __name) (smokey_lookup_arg(__t, __name)->u.l_val) 122 #define smokey_check_errno(__expr) \ 124 int __ret = (__expr); \ 127 __smokey_warning(__FILE__, __LINE__, "%s: %s", \ 128 #__expr, strerror(errno)); \ 133 #define smokey_check_status(__expr) \ 135 int __ret = (__expr); \ 137 __smokey_warning(__FILE__, __LINE__, "%s: %s", \ 138 #__expr, strerror(__ret)); \ 144 #define smokey_assert(__expr) \ 146 int __ret = (__expr); \ 148 __smokey_warning(__FILE__, __LINE__, \ 149 "assertion failed: %s", #__expr); \ 153 #define smokey_warning(__fmt, __args...) \ 154 __smokey_warning(__FILE__, __LINE__, __fmt, ##__args) 156 #define __T(__ret, __action) \ 158 (__ret) = (__action); \ 161 (__ret) = -(__ret); \ 162 smokey_warning("FAILED: %s (=%s)", \ 163 __stringify(__action), \ 169 #define __F(__ret, __action) \ 171 (__ret) = (__action); \ 173 smokey_warning("FAILED: %s (=0)", \ 174 __stringify(__action)); \ 175 else if ((__ret) > 0) \ 176 (__ret) = -(__ret); \ 180 #define __Terrno(__ret, __action) \ 182 (__ret) = (__action); \ 185 smokey_warning("FAILED: %s (=%s)", \ 186 __stringify(__action), \ 192 #define __Tassert(__expr) \ 194 int __ret = !!(__expr); \ 196 smokey_warning("FAILED: %s (=false)", \ 197 __stringify(__expr)); \ 201 #define __Fassert(__expr) \ 203 int __ret = (__expr); \ 205 smokey_warning("FAILED: %s (=true)", \ 206 __stringify(__expr)); \ 210 struct smokey_barrier {
211 pthread_mutex_t lock;
212 pthread_cond_t barrier;
220 void smokey_register_plugin(
struct smokey_test *t);
222 int smokey_int(
const char *s,
struct smokey_arg *arg);
224 int smokey_bool(
const char *s,
struct smokey_arg *arg);
226 int smokey_string(
const char *s,
struct smokey_arg *arg);
228 int smokey_size(
const char *s,
struct smokey_arg *arg);
230 struct smokey_arg *smokey_lookup_arg(
struct smokey_test *t,
233 int smokey_parse_args(
struct smokey_test *t,
234 int argc,
char *
const argv[]);
236 void smokey_vatrace(
const char *fmt, va_list ap);
238 void smokey_trace(
const char *fmt, ...);
240 void smokey_note(
const char *fmt, ...);
242 void __smokey_warning(
const char *file,
int lineno,
243 const char *fmt, ...);
245 int smokey_barrier_init(
struct smokey_barrier *b);
247 void smokey_barrier_destroy(
struct smokey_barrier *b);
249 int smokey_barrier_wait(
struct smokey_barrier *b);
251 int smokey_barrier_timedwait(
struct smokey_barrier *b,
252 struct timespec *ts);
254 void smokey_barrier_release(
struct smokey_barrier *b);
256 int smokey_fork_exec(
const char *path,
const char *arg);
262 extern struct pvlistobj smokey_test_list;
264 extern int smokey_keep_going;
266 extern int smokey_verbose_mode;
268 extern int smokey_on_vm;