| /* 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 |