 a197e6c859
			
		
	
	a197e6c859
	
	
	
		
			
			A descriptor is always added to the global epoll instance or to a specific worker, never just to _any_ worker.
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #pragma once
 | |
| /*
 | |
|  * Copyright (c) 2016 MariaDB Corporation Ab
 | |
|  *
 | |
|  * Use of this software is governed by the Business Source License included
 | |
|  * in the LICENSE.TXT file and at www.mariadb.com/bsl.
 | |
|  *
 | |
|  * Change Date: 2020-01-01
 | |
|  *
 | |
|  * On the date above, in accordance with the Business Source License, use
 | |
|  * of this software will be governed by version 2 or later of the General
 | |
|  * Public License.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @file poll_basic.h  The Descriptor Control Block
 | |
|  */
 | |
| 
 | |
| #include <maxscale/cdefs.h>
 | |
| #include <sys/epoll.h>
 | |
| #include <maxscale/atomic.h>
 | |
| 
 | |
| MXS_BEGIN_DECLS
 | |
| 
 | |
| typedef enum mxs_poll_action
 | |
| {
 | |
|     MXS_POLL_NOP    = 0x00,
 | |
|     MXS_POLL_ACCEPT = 0x01,
 | |
|     MXS_POLL_READ   = 0x02,
 | |
|     MXS_POLL_WRITE  = 0x04,
 | |
|     MXS_POLL_HUP    = 0x08,
 | |
|     MXS_POLL_ERROR  = 0x10,
 | |
| } mxs_poll_action_t;
 | |
| 
 | |
| struct mxs_poll_data;
 | |
| 
 | |
| /**
 | |
|  * Pointer to function that knows how to handle events for a particular
 | |
|  * 'struct mxs_poll_data' structure.
 | |
|  *
 | |
|  * @param data    The `mxs_poll_data` instance that contained this function pointer.
 | |
|  * @param wid     The worker thread id.
 | |
|  * @param events  The epoll events.
 | |
|  *
 | |
|  * @return A combination of mxs_poll_action_t enumeration values.
 | |
|  */
 | |
| typedef uint32_t (*mxs_poll_handler_t)(struct mxs_poll_data* data, int wid, uint32_t events);
 | |
| 
 | |
| typedef struct mxs_poll_data
 | |
| {
 | |
|     mxs_poll_handler_t handler; /*< Handler for this particular kind of mxs_poll_data. */
 | |
|     struct
 | |
|     {
 | |
|         int id;                 /*< The id of the worker thread. */
 | |
|     } thread;
 | |
| } MXS_POLL_DATA;
 | |
| 
 | |
| /**
 | |
|  * A file descriptor should be added to the poll set of all workers.
 | |
|  */
 | |
| #define MXS_WORKER_ALL -1
 | |
| 
 | |
| /**
 | |
|  * Add a file descriptor with associated data to the poll set.
 | |
|  *
 | |
|  * @param wid      `MXS_WORKER_ALL` if the file descriptor should be added to the
 | |
|  *                 poll set of all workers, `MXS_WORKER_ANY` if the file descriptor
 | |
|  *                 should be added to some worker, otherwise the id of a worker.
 | |
|  * @param fd       The file descriptor to be added.
 | |
|  * @param events   Mask of epoll event types.
 | |
|  * @param data     The structure containing the file descriptor to be
 | |
|  *                 added.
 | |
|  *
 | |
|  *                 data->handler  : Handler that knows how to deal with events
 | |
|  *                                  for this particular type of 'struct mxs_poll_data'.
 | |
|  *                 data->thread.id: Will be updated by `poll_add_fd_to_worker`.
 | |
|  *
 | |
|  * @attention If the descriptor should be added to all workers, then the worker
 | |
|  *            thread id will be 0.
 | |
|  *
 | |
|  * @attention The provided file descriptor *must* be non-blocking.
 | |
|  *
 | |
|  * @return True on success, false on failure.
 | |
|  */
 | |
| bool poll_add_fd_to_worker(int wid, int fd, uint32_t events, MXS_POLL_DATA* data);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Remove a file descriptor from a poll set.
 | |
|  *
 | |
|  * @param wid      `MXS_WORKER_ALL` if the file descriptor should be removed from
 | |
|  *                 the poll set of all workers; otherwise the id of a worker.
 | |
|  * @param fd       The file descriptor to be removed.
 | |
|  *
 | |
|  * @return True on success, false on failure.
 | |
|  */
 | |
| bool poll_remove_fd_from_worker(int wid, int fd);
 | |
| 
 | |
| MXS_END_DECLS
 |