Johan Wikman 0e4e889c15 Turn worker into a C++ class
This is the first step in turning the worker mechanism and everything
around it into a set of C++ classes. In this change, the original C
API is still present, but in subsequent changes that will be removed.
2017-04-20 13:51:16 +03:00

138 lines
3.9 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/bsl11.
*
* Change Date: 2019-07-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.
*/
#include <maxscale/cdefs.h>
#include <maxscale/poll.h>
#include <maxscale/thread.h>
MXS_BEGIN_DECLS
typedef struct mxs_worker
{
MXS_POLL_DATA m_poll; /*< The poll data used by the polling mechanism. */
int m_id; /*< The id of the worker. */
int m_read_fd; /*< The file descriptor the worked reads from. */
int m_write_fd; /*< The file descriptor used for sending data to the worker. */
THREAD m_thread; /*< The thread handle of the worker. */
bool m_started; /*< Whether the thread has been started or not. */
bool m_should_shutdown; /*< Whether shutdown should be performed. */
bool m_shutdown_initiated; /*< Whether shutdown has been initated. */
} MXS_WORKER;
enum mxs_worker_msg_id
{
/**
* Ping message.
*
* arg1: 0
* arg2: NULL or pointer to dynamically allocated NULL-terminated string,
* to be freed by worker.
*/
MXS_WORKER_MSG_PING,
/**
* Shutdown message.
*
* arg1: 0
* arg2: NULL
*/
MXS_WORKER_MSG_SHUTDOWN,
/**
* Function call message.
*
* arg1: Pointer to function with the prototype: void (*)(int thread_id, void* arg2);
* arg2: Second argument for the function passed in arg1.
*/
MXS_WORKER_MSG_CALL
};
/**
* Return the worker associated with the provided worker id.
*
* @param worker_id A worker id.
*
* @return The corresponding worker instance, or NULL if the id does
* not correspond to a worker.
*/
MXS_WORKER* mxs_worker_get(int worker_id);
/**
* Return the worker of the current thread.
*
* @return The worker instance or NULL if the calling thread is not associated
* with a worker.
*/
MXS_WORKER* mxs_worker_get_current();
/**
* Return the id of the worker of the current thread.
*
* @return The worker id or -1 if the calling thread is not associated
* with a worker.
*/
int mxs_worker_get_current_id();
/**
* Return the id of the worker.
*
* @param worker A worker.
*
* @return The id of the worker.
*/
static inline int mxs_worker_id(MXS_WORKER* pWorker)
{
return pWorker->m_id;
}
/**
* Post a message to a worker.
*
* @param worker The worker to whom the message should be sent.
* @param msg_id The message id.
* @param arg1 Message specific first argument.
* @param arg2 Message specific second argument.
*
* @return True if the message could be sent, false otherwise. If the message
* posting fails, errno is set appropriately.
*
* @attention The return value tells *only* whether the message could be sent,
* *not* that it has reached the worker.
*
* @attention This function is signal safe.
*/
bool mxs_worker_post_message(MXS_WORKER* worker, uint32_t msg_id, intptr_t arg1, intptr_t arg2);
/**
* Broadcast a message to all worker.
*
* @param msg_id The message id.
* @param arg1 Message specific first argument.
* @param arg2 Message specific second argument.
*
* @return The number of messages posted; if less that ne number of workers
* then some postings failed.
*
* @attention The return value tells *only* whether message could be posted,
* *not* that it has reached the worker.
*
* @attentsion Exactly the same arguments are passed to all workers. Take that
* into account if the passed data must be freed.
*
* @attention This function is signal safe.
*/
size_t mxs_worker_broadcast_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2);
MXS_END_DECLS