parrotcode: Event handling stuff | |
Contents | C |
src/events.c - Event handling stuff
An event_thread handles async events for all interpreters.
When events are due,
they are placed in per interpreter task_queues,
where they are handled then by the check_event*
opcodes.
IO events and signals are caught in the io_thread, which again dispatches these to one or all interpreters.
static void sig_handler(int signum)
signum
.SIGHUP
is handled at the moment for testingstatic void Parrot_sigaction(int sig, NULLOK(void (*handler)(int)))
static void Parrot_unblock_signal(int sig)
PARROT_API void Parrot_init_signals(void)
static void init_events_first(PARROT_INTERP)
static void init_events_all(PARROT_INTERP)
PARROT_API void Parrot_init_events(PARROT_INTERP)
PARROT_API void Parrot_schedule_event(PARROT_INTERP, NOTNULL(parrot_event *ev))
static void schedule_signal_event(int signum)
PARROT_API void Parrot_new_timer_event(PARROT_INTERP, NULLOK(PMC *timer), FLOATVAL diff, FLOATVAL interval, int repeat, NULLOK(PMC *sub), parrot_event_type_enum typ)
diff
from now,
repeated at interval
and running the passed sub
.PARROT_API void Parrot_new_cb_event(PARROT_INTERP, NOTNULL(PMC *cbi), NOTNULL(char *ext))
PARROT_API void Parrot_del_timer_event(PARROT_INTERP, NOTNULL(PMC *timer))
timer
.PARROT_API void Parrot_new_terminate_event(PARROT_INTERP)
PARROT_API void Parrot_new_suspend_for_gc_event(PARROT_INTERP)
PARROT_API void Parrot_kill_event_loop(PARROT_INTERP)
PARROT_API void Parrot_schedule_interp_qentry(PARROT_INTERP, NOTNULL(struct QUEUE_ENTRY *entry))
void Parrot_schedule_broadcast_qentry(NOTNULL(struct QUEUE_ENTRY *entry))
static void store_io_event(NOTNULL(pending_io_events *ios), NOTNULL(parrot_event *ev))
static void io_thread_ready_rd(NOTNULL(pending_io_events *ios), int ready_rd)
PARROT_CAN_RETURN_NULL static void *io_thread(SHIM(void *data))
static void stop_io_thread(void)
PARROT_API void Parrot_event_add_io_event(PARROT_INTERP, NULLOK(PMC *pio), NULLOK(PMC *sub), NULLOK(PMC *data), INTVAL which)
PARROT_MALLOC PARROT_CANNOT_RETURN_NULL static QUEUE_ENTRY *dup_entry(ARGIN(const QUEUE_ENTRY *entry))
PARROT_WARN_UNUSED_RESULT PARROT_CANNOT_RETURN_NULL static QUEUE_ENTRY *dup_entry_interval(NOTNULL(QUEUE_ENTRY *entry), FLOATVAL now)
abs_time
.static int process_events(NOTNULL(QUEUE *event_q))
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL static void *event_thread(NOTNULL(void *data))
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL static opcode_t *wait_for_wakeup(PARROT_INTERP, NULLOK(opcode_t *next))
PARROT_API PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL opcode_t *Parrot_sleep_on_event(PARROT_INTERP, FLOATVAL t, NULLOK(opcode_t *next))
sleep
opcode.PARROT_API PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL opcode_t *Parrot_do_check_events(PARROT_INTERP, NULLOK(opcode_t *next))
sync
called by the check_event opcode from run loops.static void event_to_exception(PARROT_INTERP, ARGIN(const parrot_event *event))
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL static opcode_t *do_event(PARROT_INTERP, NOTNULL(parrot_event *event), NULLOK(opcode_t *next))
PARROT_API PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL opcode_t *Parrot_do_handle_events(PARROT_INTERP, int restore, NULLOK(opcode_t *next))
check_event__
opcode from run loops or from above.
When called from the check_events__
opcode,
we have to restore the op_func_table
.include/parrot/events.h and docs/dev/events.pod.
|