
Worker is now the base class of all workers. It has a message queue and can be run in a thread of its own, or in the calling thread. Worker can not be used as such, but a concrete worker class must be derived from it. Currently there is only one concrete class RoutingWorker. There is some overlapping in functionality between Worker and RoutingWorker, as there is e.g. a need for broadcasting a message to all routing workers, but not to other workers. Currently other workers can not be created as the array for holding the pointers to the workers is exactly as large as there will be RoutingWorkers. That will be changed so that the maximum number of threads is hardwired to some ridiculous value such as 128. That's the first step in the path towards a situation where the number of worker threads can be changed at runtime.
98 lines
2.8 KiB
C
98 lines
2.8 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: 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.
|
|
*/
|
|
|
|
#include <maxscale/cdefs.h>
|
|
#include <maxscale/session.h>
|
|
#include <maxscale/worker.h>
|
|
|
|
MXS_BEGIN_DECLS
|
|
|
|
#define MXS_RWORKER_MAIN -1
|
|
|
|
/**
|
|
* Return the routing worker associated with the provided worker id.
|
|
*
|
|
* @param worker_id A worker id. If MXS_RWORKER_MAIN is used, the
|
|
* routing worker running in the main thread will
|
|
* be returned.
|
|
*
|
|
* @return The corresponding routing worker instance, or NULL if the
|
|
* id does not correspond to a routing worker.
|
|
*/
|
|
MXS_WORKER* mxs_rworker_get(int worker_id);
|
|
|
|
/**
|
|
* Return the current routing worker.
|
|
*
|
|
* @return A routing worker, or NULL if there is no current routing worker.
|
|
*/
|
|
MXS_WORKER* mxs_rworker_get_current();
|
|
|
|
/**
|
|
* Return the id of the current routing worker.
|
|
*
|
|
* @return The id of the routing worker, or -1 if there is no current
|
|
* routing worker.
|
|
*/
|
|
int mxs_rworker_get_current_id();
|
|
|
|
/**
|
|
* Broadcast a message to all routing workers.
|
|
*
|
|
* @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_rworker_broadcast_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2);
|
|
|
|
/**
|
|
* Add a session to the current routing worker's session container. Currently
|
|
* only required for some special commands e.g. "KILL <process_id>" to work.
|
|
*
|
|
* @param session Session to add.
|
|
* @return true if successful, false if id already existed in map.
|
|
*/
|
|
bool mxs_rworker_register_session(MXS_SESSION* session);
|
|
|
|
/**
|
|
* Remove a session from the current routing worker's session container. Does
|
|
* not actually remove anything from an epoll-set or affect the session in any
|
|
* way.
|
|
*
|
|
* @param id Which id to remove.
|
|
* @return The removed session or NULL if not found.
|
|
*/
|
|
bool mxs_rworker_deregister_session(uint64_t id);
|
|
|
|
/**
|
|
* Find a session in the current routing worker's session container.
|
|
*
|
|
* @param id Which id to find.
|
|
* @return The found session or NULL if not found.
|
|
*/
|
|
MXS_SESSION* mxs_rworker_find_session(uint64_t id);
|
|
|
|
MXS_END_DECLS
|