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;