
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
|