143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2016 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that copyright
 | |
|  * notice and this permission notice appear in supporting documentation, and
 | |
|  * that the name of the copyright holders not be used in advertising or
 | |
|  * publicity pertaining to distribution of the software without specific,
 | |
|  * written prior permission.  The copyright holders make no representations
 | |
|  * about the suitability of this software for any purpose.  It is provided "as
 | |
|  * is" without express or implied warranty.
 | |
|  *
 | |
|  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 | |
|  * OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #ifndef _OSPOLL_H_
 | |
| #define _OSPOLL_H_
 | |
| 
 | |
| /* Forward declaration */
 | |
| struct ospoll;
 | |
| 
 | |
| /**
 | |
|  * ospoll_wait trigger mode
 | |
|  *
 | |
|  * @ospoll_trigger_edge
 | |
|  *      Trigger only when going from no data available
 | |
|  *      to data available.
 | |
|  *
 | |
|  * @ospoll_trigger_level
 | |
|  *      Trigger whenever there is data available
 | |
|  */
 | |
| enum ospoll_trigger {
 | |
|     ospoll_trigger_edge,
 | |
|     ospoll_trigger_level
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Create a new ospoll structure
 | |
|  */
 | |
| struct ospoll *
 | |
| ospoll_create(void);
 | |
| 
 | |
| /**
 | |
|  * Destroy an ospoll structure
 | |
|  *
 | |
|  * @param       ospoll          ospoll to destroy
 | |
|  */
 | |
| void
 | |
| ospoll_destroy(struct ospoll *ospoll);
 | |
| 
 | |
| /**
 | |
|  * Add a file descriptor to monitor
 | |
|  *
 | |
|  * @param       ospoll          ospoll to add to
 | |
|  * @param       fd              File descriptor to monitor
 | |
|  * @param       trigger         Trigger mode for ospoll_wait
 | |
|  * @param       callback        Function to call when triggered
 | |
|  * @param       data            Extra data to pass callback
 | |
|  */
 | |
| Bool
 | |
| ospoll_add(struct ospoll *ospoll, int fd,
 | |
|            enum ospoll_trigger trigger,
 | |
|            void (*callback)(int fd, int xevents, void *data),
 | |
|            void *data);
 | |
| 
 | |
| /**
 | |
|  * Remove a monitored file descriptor
 | |
|  *
 | |
|  * @param       ospoll          ospoll to remove from
 | |
|  * @param       fd              File descriptor to stop monitoring
 | |
|  */
 | |
| void
 | |
| ospoll_remove(struct ospoll *ospoll, int fd);
 | |
| 
 | |
| /**
 | |
|  * Listen on additional events
 | |
|  *
 | |
|  * @param       ospoll          ospoll monitoring fd
 | |
|  * @param       fd              File descriptor to change
 | |
|  * @param       events          Additional events to trigger on
 | |
|  */
 | |
| void
 | |
| ospoll_listen(struct ospoll *ospoll, int fd, int xevents);
 | |
| 
 | |
| /**
 | |
|  * Stop listening on events
 | |
|  *
 | |
|  * @param       ospoll          ospoll monitoring fd
 | |
|  * @param       fd              File descriptor to change
 | |
|  * @param       events          events to stop triggering on
 | |
|  */
 | |
| void
 | |
| ospoll_mute(struct ospoll *ospoll, int fd, int xevents);
 | |
| 
 | |
| /**
 | |
|  * Wait for events
 | |
|  *
 | |
|  * @param       ospoll          ospoll to wait on
 | |
|  * @param       timeout         < 0 wait forever
 | |
|  *                              = 0 check and return
 | |
|  *                              > 0 timeout in milliseconds
 | |
|  * @return      < 0 error
 | |
|  *              = 0 timeout
 | |
|  *              > 0 number of events delivered
 | |
|  */
 | |
| int
 | |
| ospoll_wait(struct ospoll *ospoll, int timeout);
 | |
| 
 | |
| /**
 | |
|  * Reset edge trigger status
 | |
|  *
 | |
|  * @param       ospoll          ospoll monitoring fd
 | |
|  * @param       fd              file descriptor
 | |
|  *
 | |
|  * ospoll_reset_events resets the state of an edge-triggered
 | |
|  * fd so that ospoll_wait calls will report events again.
 | |
|  *
 | |
|  * Call this after a read/recv operation reports no more data available.
 | |
|  */
 | |
| void
 | |
| ospoll_reset_events(struct ospoll *ospoll, int fd);
 | |
| 
 | |
| /**
 | |
|  * Fetch the data associated with an fd
 | |
|  *
 | |
|  * @param       ospoll          ospoll monitoring fd
 | |
|  * @param       fd              file descriptor
 | |
|  *
 | |
|  * @return      data parameter passed to ospoll_add call on
 | |
|  *              this file descriptor
 | |
|  */
 | |
| void *
 | |
| ospoll_data(struct ospoll *ospoll, int fd);
 | |
| 
 | |
| #endif /* _OSPOLL_H_ */
 |