/** * Copyright (C) Hiroyuki Sato. 2019. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCS_EVENT_SET_H #define UCS_EVENT_SET_H #include /** * ucs_sys_event_set_t structure used in ucs_event_set_XXX functions. * */ typedef struct ucs_sys_event_set ucs_sys_event_set_t; /** * ucs_event_set_handler call this handler for notifying event * * @param [in] callback_data User data which set in ucs_event_set_add(). * @param [in] event Detection event. Sets of ucs_event_set_type_t. * @param [in] arg User data which set in ucs_event_set_wait(). * */ typedef void (*ucs_event_set_handler_t)(void *callback_data, int event, void *arg); /** * ucs_event_set_type_t member is a bit set composed using the following * available event types */ typedef enum { UCS_EVENT_SET_EVREAD = UCS_BIT(0), UCS_EVENT_SET_EVWRITE = UCS_BIT(1), UCS_EVENT_SET_EVERR = UCS_BIT(2), UCS_EVENT_SET_EDGE_TRIGGERED = UCS_BIT(3) } ucs_event_set_type_t; /* The maximum possible number of events based on system constraints */ extern const unsigned ucs_sys_event_set_max_wait_events; /** * Allocate ucs_sys_event_set_t structure and assign provided file * descriptor to wait for events on. * * @param [out] event_set_p Event set pointer to initialize. * @param [in] event_fd File descriptor to wait for events on. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_create_from_fd(ucs_sys_event_set_t **event_set_p, int event_fd); /** * Allocate ucs_sys_event_set_t structure. * * @param [out] event_set_p Event set pointer to initialize. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_create(ucs_sys_event_set_t **event_set_p); /** * Register the target event. * * @param [in] event_set_p Event set pointer to initialize. * @param [in] fd Register the target file descriptor fd. * @param [in] events Operation events. * @param [in] callback_data ucs_event_set_handler_t accepts this data. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_add(ucs_sys_event_set_t *event_set, int fd, ucs_event_set_type_t events, void *callback_data); /** * Modify the target event. * * @param [in] event_set Event set created by ucs_event_set_create. * @param [in] fd Register the target file descriptor fd. * @param [in] events Operation events. * @param [in] callback_data ucs_event_set_handler_t accepts this data. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_mod(ucs_sys_event_set_t *event_set, int fd, ucs_event_set_type_t events, void *callback_data); /** * Remove the target event. * * @param [in] event_set Event set created by ucs_event_set_create. * @param [in] fd Register the target file descriptor fd. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_del(ucs_sys_event_set_t *event_set, int fd); /** * Wait for an I/O events * * @param [in] event_set Event set created by ucs_event_set_create. * @param [in/out] num_events Number of expected/read events. * @param [in] timeout_ms Timeout period in ms. * @param [in] event_set_handler Callback functions. * @param [in] arg User data variables. * * @return return UCS_OK on success, UCS_INPROGRESS - call was interrupted by a * signal handler, UCS_ERR_IO_ERROR - an error occurred during waiting * for I/O events. */ ucs_status_t ucs_event_set_wait(ucs_sys_event_set_t *event_set, unsigned *num_events, int timeout_ms, ucs_event_set_handler_t event_set_handler, void *arg); /** * Cleanup event set * * @param [in] event_set Event set created by ucs_event_set_create. * */ void ucs_event_set_cleanup(ucs_sys_event_set_t *event_set); /** * Get file descriptor for watching events. * * @param [in] event_set Event set created by ucs_event_set_create. * @param [out] event_fd_p File descriptor that is used by Event set to wait * for events on. * * @return UCS_OK on success or an error code on failure. */ ucs_status_t ucs_event_set_fd_get(ucs_sys_event_set_t *event_set, int *event_fd_p); #endif