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;