| /* Copyright (c) 2011-2014 The Regents of the University of California |
| * Copyright (c) 2015 Google Inc |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Userspace utility functions for receiving events and notifications (IPIs). |
| * Some are higher level than others; just use what you need. */ |
| |
| #pragma once |
| |
| #include <ros/event.h> |
| #include <ros/syscall.h> |
| #include <parlib/common.h> |
| #include <parlib/ucq.h> |
| #include <parlib/evbitmap.h> |
| #include <parlib/ceq.h> |
| |
| __BEGIN_DECLS |
| |
| /********* Event_q Setup / Registration ***********/ |
| struct event_queue *get_eventq(int mbox_type); |
| struct event_queue *get_eventq_raw(void); |
| struct event_queue *get_eventq_slim(void); |
| struct event_queue *get_eventq_vcpd(uint32_t vcoreid, int ev_flags); |
| void put_eventq(struct event_queue *ev_q); |
| void put_eventq_raw(struct event_queue *ev_q); |
| void put_eventq_slim(struct event_queue *ev_q); |
| void put_eventq_vcpd(struct event_queue *ev_q); |
| |
| void event_mbox_init(struct event_mbox *ev_mbox, int mbox_type); |
| void event_mbox_cleanup(struct event_mbox *ev_mbox); |
| |
| void register_kevent_q(struct event_queue *ev_q, unsigned int ev_type); |
| struct event_queue *clear_kevent_q(unsigned int ev_type); |
| void enable_kevent(unsigned int ev_type, uint32_t vcoreid, int ev_flags); |
| struct event_queue *disable_kevent(unsigned int ev_type); |
| |
| /********* Event Handling / Reception ***********/ |
| unsigned int get_event_type(struct event_mbox *ev_mbox); |
| bool register_evq(struct syscall *sysc, struct event_queue *ev_q); |
| void deregister_evq(struct syscall *sysc); |
| |
| typedef void (*handle_event_t)(struct event_msg *ev_msg, unsigned int ev_type, |
| void *data); |
| struct ev_handler { |
| struct ev_handler *next; |
| handle_event_t func; |
| void *data; |
| }; |
| extern struct ev_handler *ev_handlers[]; |
| int register_ev_handler(unsigned int ev_type, handle_event_t handler, |
| void *data); |
| int deregister_ev_handler(unsigned int ev_type, handle_event_t handler, |
| void *data); |
| |
| /* Default event handlers */ |
| void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type, void *data); |
| |
| int handle_events(uint32_t vcoreid); |
| void handle_event_q(struct event_queue *ev_q); |
| bool extract_one_mbox_msg(struct event_mbox *ev_mbox, struct event_msg *ev_msg); |
| int handle_one_mbox_msg(struct event_mbox *ev_mbox); |
| int handle_mbox(struct event_mbox *ev_mbox); |
| bool mbox_is_empty(struct event_mbox *ev_mbox); |
| void send_self_vc_msg(struct event_msg *ev_msg); |
| void handle_vcpd_mbox(uint32_t rem_vcoreid); |
| void try_handle_remote_mbox(void); |
| |
| /* Event handler helpers */ |
| bool ev_might_not_return(void); |
| void ev_we_returned(bool were_handling_remotes); |
| |
| /* Debugging */ |
| void print_ev_msg(struct event_msg *msg); |
| |
| /* Uthreads blocking on event queues. M uthreads can block on subsets of N |
| * event queues. The structs and details are buried in event.c. We can move |
| * some of them here if users need greater control over their evqs. */ |
| void evq_attach_wakeup_ctlr(struct event_queue *ev_q); |
| void evq_remove_wakeup_ctlr(struct event_queue *ev_q); |
| /* Handler, attaches to the ev_q. Most people won't need this directly. */ |
| void evq_wakeup_handler(struct event_queue *ev_q); |
| void uth_blockon_evqs_arr(struct event_msg *ev_msg, |
| struct event_queue **which_evq, |
| struct event_queue *evqs[], size_t nr_evqs); |
| void uth_blockon_evqs(struct event_msg *ev_msg, struct event_queue **which_evq, |
| size_t nr_evqs, ...); |
| bool uth_check_evqs(struct event_msg *ev_msg, struct event_queue **which_evq, |
| size_t nr_evqs, ...); |
| |
| __END_DECLS |