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> 28 #define SMOKEY_INT(__name) { \ 30 .parser = smokey_int, \ 34 #define SMOKEY_BOOL(__name) { \ 36 .parser = smokey_bool, \ 40 #define SMOKEY_STRING(__name) { \ 42 .parser = smokey_string, \ 46 #define SMOKEY_ARGLIST(__args...) ((struct smokey_arg[]){ __args }) 48 #define SMOKEY_NOARGS (((struct smokey_arg[]){ { .name = NULL } })) 52 int (*parser)(
const char *s,
53 struct smokey_arg *arg);
63 struct smokey_arg *args;
65 const char *description;
66 int (*run)(
struct smokey_test *t,
67 int argc,
char *
const argv[]);
74 #define for_each_smokey_test(__pos) \ 75 pvlist_for_each_entry((__pos), &smokey_test_list, __reserved.next) 77 #define __smokey_arg_count(__args) \ 78 (sizeof(__args) / sizeof(__args[0])) 80 #define smokey_test_plugin(__plugin, __args, __desc) \ 81 static int run_ ## __plugin(struct smokey_test *t, \ 82 int argc, char *const argv[]); \ 83 static struct smokey_test __plugin = { \ 86 .nargs = __smokey_arg_count(__args), \ 87 .description = (__desc), \ 88 .run = run_ ## __plugin, \ 90 __early_ctor void smokey_plugin_ ## __plugin(void); \ 91 void smokey_plugin_ ## __plugin(void) \ 93 smokey_register_plugin(&(__plugin)); \ 96 #define SMOKEY_ARG(__plugin, __arg) (smokey_lookup_arg(&(__plugin), # __arg)) 97 #define SMOKEY_ARG_ISSET(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->matched) 98 #define SMOKEY_ARG_INT(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.n_val) 99 #define SMOKEY_ARG_BOOL(__plugin, __arg) (!!SMOKEY_ARG_INT(__plugin, __arg)) 100 #define SMOKEY_ARG_STRING(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.s_val) 102 #define smokey_check_errno(__expr) \ 104 int __ret = (__expr); \ 107 __smokey_warning(__FILE__, __LINE__, "%s: %s", \ 108 #__expr, strerror(errno)); \ 113 #define smokey_check_status(__expr) \ 115 int __ret = (__expr); \ 117 __smokey_warning(__FILE__, __LINE__, "%s: %s", \ 118 #__expr, strerror(__ret)); \ 124 #define smokey_assert(__expr) \ 126 int __ret = (__expr); \ 128 __smokey_warning(__FILE__, __LINE__, \ 129 "assertion failed: %s", #__expr); \ 133 #define smokey_warning(__fmt, __args...) \ 134 __smokey_warning(__FILE__, __LINE__, __fmt, ##__args) 136 #define __T(__ret, __action) \ 138 (__ret) = (__action); \ 141 (__ret) = -(__ret); \ 142 smokey_warning("FAILED: %s (=%s)", \ 143 __stringify(__action), \ 149 #define __F(__ret, __action) \ 151 (__ret) = (__action); \ 153 smokey_warning("FAILED: %s (=0)", \ 154 __stringify(__action)); \ 155 else if ((__ret) > 0) \ 156 (__ret) = -(__ret); \ 160 #define __Terrno(__ret, __action) \ 162 (__ret) = (__action); \ 165 smokey_warning("FAILED: %s (=%s)", \ 166 __stringify(__action), \ 172 #define __Tassert(__expr) \ 174 int __ret = !!(__expr); \ 176 smokey_warning("FAILED: %s (=false)", \ 177 __stringify(__expr)); \ 181 #define __Fassert(__expr) \ 183 int __ret = (__expr); \ 185 smokey_warning("FAILED: %s (=true)", \ 186 __stringify(__expr)); \ 190 struct smokey_barrier {
191 pthread_mutex_t lock;
192 pthread_cond_t barrier;
200 void smokey_register_plugin(
struct smokey_test *t);
202 int smokey_int(
const char *s,
struct smokey_arg *arg);
204 int smokey_bool(
const char *s,
struct smokey_arg *arg);
206 int smokey_string(
const char *s,
struct smokey_arg *arg);
208 struct smokey_arg *smokey_lookup_arg(
struct smokey_test *t,
211 int smokey_parse_args(
struct smokey_test *t,
212 int argc,
char *
const argv[]);
214 void smokey_vatrace(
const char *fmt, va_list ap);
216 void smokey_trace(
const char *fmt, ...);
218 void smokey_note(
const char *fmt, ...);
220 void __smokey_warning(
const char *file,
int lineno,
221 const char *fmt, ...);
223 int smokey_barrier_init(
struct smokey_barrier *b);
225 void smokey_barrier_destroy(
struct smokey_barrier *b);
227 int smokey_barrier_wait(
struct smokey_barrier *b);
229 int smokey_barrier_timedwait(
struct smokey_barrier *b,
230 struct timespec *ts);
232 void smokey_barrier_release(
struct smokey_barrier *b);
238 extern struct pvlistobj smokey_test_list;
240 extern int smokey_keep_going;
242 extern int smokey_verbose_mode;
244 extern int smokey_on_vm;