61typedef uint8_t process_event_t;
62typedef void * process_data_t;
63typedef uint8_t process_num_events_t;
76#define PROCESS_ERR_OK 0
84#define PROCESS_ERR_FULL 1
87#define PROCESS_NONE NULL
89#ifndef PROCESS_CONF_NUMEVENTS
90#define PROCESS_CONF_NUMEVENTS 32
93#define PROCESS_EVENT_NONE 0x80
94#define PROCESS_EVENT_INIT 0x81
95#define PROCESS_EVENT_POLL 0x82
96#define PROCESS_EVENT_EXIT 0x83
97#define PROCESS_EVENT_SERVICE_REMOVED 0x84
98#define PROCESS_EVENT_CONTINUE 0x85
99#define PROCESS_EVENT_MSG 0x86
100#define PROCESS_EVENT_EXITED 0x87
101#define PROCESS_EVENT_TIMER 0x88
102#define PROCESS_EVENT_COM 0x89
103#define PROCESS_EVENT_UNLOCKED 0x8a
104#define PROCESS_EVENT_MAX 0x8b
106#define PROCESS_BROADCAST NULL
122#define PROCESS_BEGIN() PT_BEGIN(process_pt)
133#define PROCESS_END() PT_END(process_pt)
143#define PROCESS_WAIT_EVENT() PROCESS_YIELD()
159#define PROCESS_WAIT_EVENT_UNTIL(c) PROCESS_YIELD_UNTIL(c)
166#define PROCESS_YIELD() PT_YIELD(process_pt)
180#define PROCESS_YIELD_UNTIL(c) PT_YIELD_UNTIL(process_pt, c)
194#define PROCESS_WAIT_UNTIL(c) PT_WAIT_UNTIL(process_pt, c)
195#define PROCESS_WAIT_WHILE(c) PT_WAIT_WHILE(process_pt, c)
202#define PROCESS_EXIT() PT_EXIT(process_pt)
213#define PROCESS_PT_SPAWN(pt, thread) PT_SPAWN(process_pt, pt, thread)
223#define PROCESS_PAUSE() do { \
224 process_post(PROCESS_CURRENT(), PROCESS_EVENT_CONTINUE, NULL); \
225 PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_CONTINUE); \
244#define PROCESS_POLLHANDLER(handler) if(ev == PROCESS_EVENT_POLL) { handler; }
256#define PROCESS_EXITHANDLER(handler) if(ev == PROCESS_EVENT_EXIT) { handler; }
275#define PROCESS_THREAD(name, ev, data) \
276static PT_THREAD(process_thread_##name(struct pt *process_pt, \
277 process_event_t ev, \
278 process_data_t data))
288#define PROCESS_NAME(name) extern struct process name
303#if PROCESS_CONF_NO_PROCESS_NAMES
304#define PROCESS(name, strname) \
305 PROCESS_THREAD(name, ev, data); \
306 struct process name = { NULL, \
307 process_thread_##name, {0}, 0, 0 }
309#define PROCESS(name, strname) \
310 PROCESS_THREAD(name, ev, data); \
311 struct process name = { NULL, strname, \
312 process_thread_##name, {0}, 0, 0 }
318 struct process *next;
319#if PROCESS_CONF_NO_PROCESS_NAMES
320#define PROCESS_NAME_STRING(process) ""
323#define PROCESS_NAME_STRING(process) ((process) != NULL ? (process)->name : "")
325 PT_THREAD((* thread)(
struct pt *, process_event_t, process_data_t));
368int process_post(
struct process *p, process_event_t ev, process_data_t data);
381 process_event_t ev, process_data_t data);
405#define PROCESS_CURRENT() process_current
406extern struct process *process_current;
429#define PROCESS_CONTEXT_BEGIN(p) {\
430struct process *tmp_current = PROCESS_CURRENT();\
443#define PROCESS_CONTEXT_END(p) process_current = tmp_current; }
533extern struct process *process_list;
535#define PROCESS_LIST() process_list
Default definitions of C compiler quirk work-arounds.
process_num_events_t process_run(void)
Run the system once - call poll handlers and process one event.
int process_post(struct process *p, process_event_t ev, process_data_t data)
Post an asynchronous event.
void process_exit(struct process *p)
Cause a process to exit.
void process_post_synch(struct process *p, process_event_t ev, process_data_t data)
Post a synchronous event to a process.
bool process_is_running(struct process *p)
Check if a process is running.
process_event_t process_alloc_event(void)
Allocate a global event number.
void process_start(struct process *p, process_data_t data)
Start a process.
void process_init(void)
Initialize the process module.
process_num_events_t process_nevents(void)
Number of events waiting to be processed.
void process_poll(struct process *p)
Request a process to be polled.
#define PT_THREAD(name_args)
Declaration of a protothread.
Protothreads implementation.