18#ifndef _XENOMAI_SMOKEY_SMOKEY_H
19#define _XENOMAI_SMOKEY_SMOKEY_H
24#include <boilerplate/list.h>
25#include <boilerplate/libc.h>
26#include <copperplate/clockobj.h>
27#include <xenomai/init.h>
35#define SMOKEY_INT(__name) { \
37 .parser = smokey_int, \
41#define SMOKEY_BOOL(__name) { \
43 .parser = smokey_bool, \
47#define SMOKEY_STRING(__name) { \
49 .parser = smokey_string, \
53#define SMOKEY_SIZE(__name) { \
55 .parser = smokey_size, \
59#define SMOKEY_ARGLIST(__args...) ((struct smokey_arg[]){ __args })
61#define SMOKEY_NOARGS (((struct smokey_arg[]){ { .name = NULL } }))
65 int (*parser)(
const char *s,
66 struct smokey_arg *arg);
77 struct smokey_arg *args;
79 const char *description;
80 int (*run)(
struct smokey_test *t,
81 int argc,
char *
const argv[]);
88#define for_each_smokey_test(__pos) \
89 pvlist_for_each_entry((__pos), &smokey_test_list, __reserved.next)
91#define __smokey_arg_count(__args) \
94#define smokey_test_plugin(__plugin, __args, __desc) \
95 static int run_ ## __plugin(struct smokey_test *t, \
96 int argc, char *const argv[]); \
97 static struct smokey_test __plugin = { \
100 .nargs = __smokey_arg_count(__args), \
101 .description = (__desc), \
102 .run = run_ ## __plugin, \
104 __early_ctor void smokey_plugin_ ## __plugin(void); \
105 void smokey_plugin_ ## __plugin(void) \
107 smokey_register_plugin(&(__plugin)); \
110#define SMOKEY_ARG(__plugin, __arg) (smokey_lookup_arg(&(__plugin), # __arg))
111#define SMOKEY_ARG_ISSET(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->matched)
112#define SMOKEY_ARG_INT(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.n_val)
113#define SMOKEY_ARG_BOOL(__plugin, __arg) (!!SMOKEY_ARG_INT(__plugin, __arg))
114#define SMOKEY_ARG_STRING(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.s_val)
115#define SMOKEY_ARG_SIZE(__plugin, __arg) (SMOKEY_ARG(__plugin, __arg)->u.l_val)
117#define smokey_arg_isset(__t, __name) (smokey_lookup_arg(__t, __name)->matched)
118#define smokey_arg_int(__t, __name) (smokey_lookup_arg(__t, __name)->u.n_val)
119#define smokey_arg_bool(__t, __name) (!!smokey_arg_int(__t, __name))
120#define smokey_arg_string(__t, __name) (smokey_lookup_arg(__t, __name)->u.s_val)
121#define smokey_arg_size(__t, __name) (smokey_lookup_arg(__t, __name)->u.l_val)
123#define smokey_check_errno(__expr) \
125 int __ret = (__expr); \
128 __smokey_warning(__FILE__, __LINE__, "%s: %s", \
129 #__expr, strerror(errno)); \
134#define smokey_check_status(__expr) \
136 int __ret = (__expr); \
138 __smokey_warning(__FILE__, __LINE__, "%s: %s", \
139 #__expr, strerror(__ret)); \
145#define smokey_assert(__expr) \
147 int __ret = (__expr); \
149 __smokey_warning(__FILE__, __LINE__, \
150 "assertion failed: %s", #__expr); \
154#define smokey_warning(__fmt, __args...) \
155 __smokey_warning(__FILE__, __LINE__, __fmt, ##__args)
157#define __T(__ret, __action) \
159 (__ret) = (__action); \
162 (__ret) = -(__ret); \
163 smokey_warning("FAILED: %s (=%s)", \
164 __stringify(__action), \
170#define __F(__ret, __action) \
172 (__ret) = (__action); \
174 smokey_warning("FAILED: %s (=0)", \
175 __stringify(__action)); \
176 else if ((__ret) > 0) \
177 (__ret) = -(__ret); \
181#define __Terrno(__ret, __action) \
183 (__ret) = (__action); \
186 smokey_warning("FAILED: %s (=%s)", \
187 __stringify(__action), \
193#define __Tassert(__expr) \
195 int __ret = !!(__expr); \
197 smokey_warning("FAILED: %s (=false)", \
198 __stringify(__expr)); \
202#define __Fassert(__expr) \
204 int __ret = (__expr); \
206 smokey_warning("FAILED: %s (=true)", \
207 __stringify(__expr)); \
211struct smokey_barrier {
212 pthread_mutex_t lock;
213 pthread_cond_t barrier;
221void smokey_register_plugin(
struct smokey_test *t);
223int smokey_int(
const char *s,
struct smokey_arg *arg);
225int smokey_bool(
const char *s,
struct smokey_arg *arg);
227int smokey_string(
const char *s,
struct smokey_arg *arg);
229int smokey_size(
const char *s,
struct smokey_arg *arg);
231struct smokey_arg *smokey_lookup_arg(
struct smokey_test *t,
234int smokey_parse_args(
struct smokey_test *t,
235 int argc,
char *
const argv[]);
237void smokey_vatrace(
const char *fmt, va_list ap);
239void smokey_trace(
const char *fmt, ...);
241void smokey_note(
const char *fmt, ...);
243void __smokey_warning(
const char *file,
int lineno,
244 const char *fmt, ...);
246int smokey_barrier_init(
struct smokey_barrier *b);
248void smokey_barrier_destroy(
struct smokey_barrier *b);
250int smokey_barrier_wait(
struct smokey_barrier *b);
252int smokey_barrier_timedwait(
struct smokey_barrier *b,
253 struct timespec *ts);
255void smokey_barrier_release(
struct smokey_barrier *b);
257int smokey_fork_exec(
const char *path,
const char *arg);
259int smokey_modprobe(
const char *name,
bool silent);
261int smokey_rmmod(
const char *name);
263int smokey_run_extprog(
const char *dir,
const char *name,
const char *args,
270extern struct pvlistobj smokey_test_list;
272extern int smokey_keep_going;
274extern int smokey_verbose_mode;
276extern int smokey_on_vm;