30#ifndef XCOM_STANDALONE
48#ifdef TASK_EVENT_TRACE
49void add_base_event(
double when,
char const *
file,
int state);
50#define ADD_BASE_EVENT \
52 add_base_event(seconds(), __FILE__, __LINE__); \
53 add_event(EVENT_DUMP_PAD, string_arg(__func__)); \
56#define ADD_DBG(d, x) \
59 add_event(EVENT_DUMP_PAD, end_arg()); \
62#define ADD_EVENTS(x) ADD_DBG(D_BUG, x)
64#define ADD_T_EV(when, file, state, what)
65#define ADD_WAIT_EV(when, file, state, what, milli)
70#define ADD_T_EV(when, file, state, what)
71#define ADD_WAIT_EV(when, file, state, what, milli)
156 return (
char const *)arg.
val.
v;
227#define TASK_POOL_ELEMS 1000
274#define _ep ((struct env *)(stack->sp->ptr))
276#define TASK_ALLOC(pool, type) (task_allocate(pool, (unsigned int)sizeof(type)))
279#define TASK_DEBUG(x) \
280 if (stack->debug) { \
281 IFDBG(D_NONE, FN; STRLIT(x " task "); PTREXP((void *)stack); \
282 STRLIT(stack->name); NDBG(stack->sp->state, d)); \
294#define ON_STACK_TOP (stack->sp == stack->stack_top + 1)
300 if (ON_STACK_TOP && stack->terminate) goto task_cleanup
302#define TERMINATE goto task_cleanup
310 if (stack->sp->state) { \
311 add_event(EVENT_DUMP_PAD, string_arg("state")); \
312 add_event(EVENT_DUMP_PAD, int_arg(stack->sp->state)); \
313 } add_event(EVENT_DUMP_PAD, string_arg("TASK_BEGIN")); \
314 add_event(EVENT_DUMP_PAD, void_arg(stack));); \
315 TASK_DEBUG("TASK_BEGIN"); \
316 switch (stack->sp->state) { \
318 pushp(stack, TASK_ALLOC(stack, struct env)); \
328 if (stack->sp->state) { \
329 add_event(EVENT_DUMP_PAD, string_arg("state")); \
330 add_event(EVENT_DUMP_PAD, int_arg(stack->sp->state)); \
331 } add_event(EVENT_DUMP_PAD, string_arg("TASK_END")); \
332 add_event(EVENT_DUMP_PAD, void_arg(stack));); \
333 TASK_DEBUG("TASK_END"); \
334 stack->sp->state = 0; \
335 stack->where = (TaskAlign *)stack->sp->ptr; \
336 assert(stack->where); \
343#define TASK_RETURN(x) \
349#define TASK_DUMP_ERR \
350 if (errno || SOCK_ERRNO || task_errno) { \
351 IFDBG(D_NONE, FN; NDBG(errno, d); STREXP(strerror(errno)); \
352 NDBG(SOCK_ERRNO, d); STREXP(strerror(SOCK_ERRNO)); \
353 NDBG(task_errno, d); STREXP(strerror(task_errno))); \
361 IFDBG(D_NONE, FN; STRLIT("TASK_FAIL")); \
362 ADD_DBG(D_TASK, add_event(EVENT_DUMP_PAD, string_arg("task failed"))); \
371 TASK_DEBUG("TASK_YIELD"); \
372 stack->sp->state = __LINE__; \
375 TASK_DEBUG("RETURN FROM YIELD"); \
381#define TASK_DEACTIVATE \
383 TASK_DEBUG("TASK_DEACTIVATE"); \
384 task_deactivate(stack); \
391#define TASK_DELAY(t) \
393 TASK_DEBUG("TASK_DELAY"); \
394 task_delay_until(seconds() + t); \
401#define TASK_DELAY_UNTIL(t) \
403 TASK_DEBUG("TASK_DELAY_UNTIL"); \
404 task_delay_until(t); \
409#define TASK_WAIT(queue) \
411 TASK_DEBUG("TASK_WAIT"); \
412 task_wait(stack, queue); \
417#define TIMED_TASK_WAIT(queue, t) \
419 TASK_DEBUG("TIMED_TASK_WAIT"); \
420 task_delay_until(seconds() + (t)); \
421 task_wait(stack, queue); \
442#define CHANNEL_GET(channel, ptr, type) \
444 while (link_empty(&(channel)->data)) { \
445 TASK_WAIT(&(channel)->queue); \
447 *(ptr) = (type *)link_extract_first(&(channel)->data); \
448 IFDBG(D_TRANSPORT, FN; STRLIT("CHANNEL_GET "); PTREXP(*(ptr)); \
449 PTREXP(&((channel)->data))); \
452#define CHANNEL_PEEK(channel, ptr, type) \
454 while (link_empty(&(channel)->data)) { \
455 TASK_WAIT(&(channel)->queue); \
457 *(ptr) = (type *)link_first(&(channel)->data); \
460#define CHANNEL_GET_REVERSE(channel, ptr, type) \
462 while (link_empty(&(channel)->data)) { \
463 TASK_WAIT(&(channel)->queue); \
465 *(ptr) = (type *)link_extract_last(&(channel)->data); \
473#define TASK_CALL(funcall) \
475 reset_state(stack); \
476 TASK_DEBUG("BEFORE CALL"); \
479 stack->taskret = funcall; \
482 if (stack->taskret) TASK_YIELD; \
483 } while (stack->taskret); \
484 TASK_DEBUG("AFTER CALL"); \
489#define DECL_ENV struct env {
493#define ENV_INIT void init() {
495#define END_ENV_INIT }
501 [[maybe_unused]] struct env *ep
506#define LOCK_FD(fd, op) \
511 wait_io(stack, fd, op); \
518#define UNLOCK_FD(fd, op) unlock_fd(fd, stack, op)
520#ifdef TASK_EVENT_TRACE
521enum { EVENT_DUMP_PAD = 1, EVENT_DUMP_HEX = 2 };
528typedef struct task_event task_event;
531void add_task_event(
double when,
char const *
file,
int state,
char const *what);
532void add_wait_event(
double when,
char const *
file,
int state,
char const *what,
534void dump_task_events();
535void reset_task_events();
609extern xcom_proto
const
static char * add_event(const char *var, LEX_CSTRING event, const char *data, size_t data_length)
Definition: audit_null.cc:305
static char buf[MAX_BUF]
Definition: conf_to_src.cc:72
const char * p
Definition: ctype-mb.cc:1234
static int flag
Definition: hp_test1.cc:39
Header for compiler-dependent features.
static QUEUE queue
Definition: myisampack.cc:209
Definition: buf0block_hint.cc:29
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:78
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:497
struct result result
Definition: result.h:33
required string type
Definition: replication_group_member_actions.proto:33
case opt name
Definition: sslopt-case.h:32
linkage queue
Definition: task.h:428
linkage data
Definition: task.h:427
Definition: node_connection.h:46
Definition: task_arg.h:41
unsigned long u_l
Definition: task_arg.h:47
float f
Definition: task_arg.h:49
double d
Definition: task_arg.h:50
void * v
Definition: task_arg.h:52
long l
Definition: task_arg.h:45
unsigned int u_i
Definition: task_arg.h:46
char const * s
Definition: task_arg.h:51
arg_type type
Definition: task_arg.h:42
unsigned long long u_ll
Definition: task_arg.h:48
int i
Definition: task_arg.h:44
task_func func
Definition: task.h:250
linkage l
Definition: task.h:242
TaskAlign * sp
Definition: task.h:255
int interrupt
Definition: task.h:260
int waitfd
Definition: task.h:259
TaskAlign * stack_top
Definition: task.h:254
task_arg arg
Definition: task.h:251
double time
Definition: task.h:256
linkage all
Definition: task.h:243
int taskret
Definition: task.h:249
int refcnt
Definition: task.h:248
int heap_pos
Definition: task.h:244
int debug
Definition: task.h:258
TaskAlign * where
Definition: task.h:253
terminate_enum terminate
Definition: task.h:247
const char * name
Definition: task.h:252
int state
Definition: task.h:214
void * ptr
Definition: task.h:215
int curn
Definition: task.h:269
task_env * x[MAXTASKS+1]
Definition: task.h:270
static double get_double_arg(task_arg arg)
Definition: task.h:139
int task_errno
Definition: task.cc:133
void task_sys_init()
Definition: task.cc:1287
void channel_put(channel *c, linkage *data)
Definition: task.cc:609
static void set_ulong_long_arg(task_arg *arg, unsigned long long value)
Definition: task.h:109
static void set_ulong_arg(task_arg *arg, unsigned long value)
Definition: task.h:104
#define MAXTASKS
Definition: task.h:265
static void set_int_arg(task_arg *arg, int value)
Definition: task.h:74
static task_arg string_arg(char const *v)
Definition: task.h:194
#define TASK_POOL_ELEMS
Definition: task.h:227
void task_wakeup(linkage *queue)
Definition: task.cc:584
static unsigned long long get_ulong_long_arg(task_arg arg)
Definition: task.h:119
task_env * task_deactivate(task_env *t)
Definition: task.cc:731
void popp(task_env *p)
Definition: task.cc:680
result con_write(connection_descriptor const *wfd, void *buf, int n)
Definition: task.cc:994
int unlock_fd(int fd, task_env *t, int lock)
result con_read(connection_descriptor const *rfd, void *buf, int n)
Definition: task.cc:906
static task_arg void_arg(void *v)
Definition: task.h:200
double seconds()
Definition: task.cc:309
static void set_float_arg(task_arg *arg, float value)
Definition: task.h:124
static task_arg uint_arg(unsigned int i)
Definition: task.h:170
static unsigned int get_uint_arg(task_arg arg)
Definition: task.h:99
static task_arg ulong_arg(unsigned long l)
Definition: task.h:176
void channel_put_front(channel *c, linkage *data)
Definition: task.cc:615
terminate_enum
Definition: task.h:229
@ TERMINATED
Definition: task.h:232
@ RUN
Definition: task.h:230
@ KILL
Definition: task.h:231
int(* task_func)(task_arg arg)
Definition: task.h:223
static task_arg int_arg(int i)
Definition: task.h:164
void task_delay_until(double time)
Definition: task.cc:568
task_env * task_terminate(task_env *t)
Definition: task.cc:734
task_env * timed_wait_io(task_env *t, int fd, int op, double timeout)
int task_write(connection_descriptor const *con, void *buf, uint32_t n, int64_t *ret)
Definition: task.cc:1040
int task_read(connection_descriptor const *con, void *buf, int n, int64_t *ret, connnection_read_method read_function=con_read)
Definition: task.cc:949
result con_pipe_read(connection_descriptor const *rfd, void *buf, int n)
Definition: task.cc:932
static void set_string_arg(task_arg *arg, char const *value)
Definition: task.h:144
static task_arg end_arg()
Definition: task.h:206
unsigned long long int get_time_since_the_epoch()
Return time in microseconds.
Definition: task.cc:384
int is_only_task()
Definition: task.cc:1135
result set_nodelay(int fd)
Definition: xcom_transport.cc:132
result(* connnection_read_method)(connection_descriptor const *rfd, void *buf, int n)
Definition: task.h:561
const char * task_name()
Definition: task.cc:1309
static task_arg ulong_long_arg(unsigned long long ll)
Definition: task.h:182
xcom_proto const my_xcom_version
Definition: xcom_transport.cc:81
result(* connnection_write_method)(connection_descriptor const *rfd, void *buf, int n)
Definition: task.h:571
channel * channel_init(channel *c, unsigned int type)
Definition: task.cc:603
int unblock_fd(int fd)
Definition: task.cc:1097
void reset_state(task_env *p)
Definition: task.cc:660
void remove_and_wakeup(int i)
Definition: task.cc:879
static void set_long_arg(task_arg *arg, long value)
Definition: task.h:84
static void * get_void_arg(task_arg arg)
Definition: task.h:159
void task_wait(task_env *t, linkage *queue)
Definition: task.cc:576
static void set_uint_arg(task_arg *arg, unsigned int value)
Definition: task.h:94
static task_arg double_arg(double i)
Definition: task.h:188
static int get_int_arg(task_arg arg)
Definition: task.h:79
result con_pipe_write(connection_descriptor const *wfd, void *buf, int n)
Definition: task.cc:1022
xcom_proto const my_min_xcom_version
Definition: xcom_transport.cc:79
static float get_float_arg(task_arg arg)
Definition: task.h:129
static long get_long_arg(task_arg arg)
Definition: task.h:89
double task_now()
Definition: task.cc:317
task_env * stack
Definition: task.cc:891
void task_loop()
Definition: task.cc:1156
void * task_allocate(task_env *p, unsigned int bytes)
Allocate bytes from pool, initialized to zero.
Definition: task.cc:642
void set_task(task_env **p, task_env *t)
Definition: task.cc:1303
task_env * task_activate(task_env *t)
Definition: task.cc:729
task_env * task_new(task_func func, task_arg arg, const char *name, int debug)
Definition: task.cc:621
int lock_fd(int fd, task_env *t, int lock)
task_env * wait_io(task_env *t, int fd, int op)
Definition: task.cc:893
int block_fd(int fd)
Definition: task.cc:1115
static char const * get_string_arg(task_arg arg)
Definition: task.h:154
void task_terminate_all()
Definition: task.cc:747
static unsigned long get_ulong_arg(task_arg arg)
Definition: task.h:114
static void set_double_arg(task_arg *arg, double value)
Definition: task.h:134
static void set_void_arg(task_arg *arg, void *value)
Definition: task.h:149
void pushp(task_env *p, void *ptr)
Definition: task.cc:669
@ a_int
Definition: task_arg.h:28
@ a_double
Definition: task_arg.h:34
@ a_end
Definition: task_arg.h:37
@ a_ulong_long
Definition: task_arg.h:32
@ a_uint
Definition: task_arg.h:30
@ a_long
Definition: task_arg.h:29
@ a_void
Definition: task_arg.h:35
@ a_float
Definition: task_arg.h:33
@ a_string
Definition: task_arg.h:36
@ a_ulong
Definition: task_arg.h:31
int n
Definition: xcom_base.cc:508