#ifndef _WAITER_H_ #define _WAITER_H_ /** Waiter type. */ struct waiter; /** Create a new waiter. * @return Newly created waiter on success, NULL on failure. */ struct waiter *waiter_create(void); /** Destroy existing waiter. * @param w waiter to destroy. */ void waiter_destroy(struct waiter *w); /** Wait for next ticket. * @param w waiter. */ void waiter_wait(struct waiter *w); /** Wait for next ticket or timeout. * @param w waiter. * @param ms timeout in milliseconds. * @return 0 on ticket; !0 on timeout. */ int waiter_wait_timeout(struct waiter *w, unsigned int ms); /** Synchronize timer-based tickets. * @param w waiter. */ void waiter_synchronize(struct waiter *w); /** Waiter ticket type. */ struct waiter_ticket; /** Add a null wait ticket to pool. * @param w waiter * @return wait ticket on success; NULL on failure. */ struct waiter_ticket *waiter_add_null(struct waiter *w); /** Add a file descriptor to the pool. * @param w waiter. * @param fd file descriptor. * @return wait ticket on success; NULL on failure. */ struct waiter_ticket *waiter_add_fd(struct waiter *w, int fd); /** Add a timeout to the pool. * @param w waiter. * @param ms duration of timeout in milliseconds. * @return wait ticket on success; NULL on failure. */ struct waiter_ticket *waiter_add_timeout(struct waiter *w, unsigned int ms); /** Set ticket type to null. * @param tkt wait ticket. */ void waiter_ticket_set_null(struct waiter_ticket *tkt); /** Set ticket type to file descriptor. * @param tkt wait ticket. * @param fd file descriptor. */ void waiter_ticket_set_fd(struct waiter_ticket *tkt, int fd); /** Set ticket type to timeout. * @param tkt wait ticket. * @param ms timeout in milliseconds. */ void waiter_ticket_set_timeout(struct waiter_ticket *tkt, unsigned int ms); /** Destroy ticket. * @param tkt wait ticket. */ void waiter_ticket_delete(struct waiter_ticket *tkt); /** Check to see if ticket has triggered. * @param tkt wait ticket. * @return 0 if triggered, !0 otherwise. */ int waiter_ticket_check(const struct waiter_ticket *tkt); /** Clear ticket trigger status. * @param tkt wait ticket. * @return 0 if triggered, !0 otherwise. */ int waiter_ticket_clear(struct waiter_ticket *tkt); /** Wait ticket callback function type. */ typedef void (* waiter_ticket_cb_t)(void *, struct waiter_ticket *); /** Register callback function for ticket trigger. * @param tkt wait ticket. * @param cb_fn callback function. * @param data private data to pass to callback function. */ void waiter_ticket_callback(struct waiter_ticket *tkt, waiter_ticket_cb_t cb_fn, void *data); #endif