mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-14 01:30:54 +00:00
b53eb8790e
This adds a call to function <fct> to the list of functions to be called at the step just before the configuration validity checks. This is useful when you need to create things like it would have been done during the configuration parsing and where the initialization should continue in the configuration check. It could be used for example to generate a proxy with multiple servers using the configuration parser itself. At this step the trash buffers are allocated. Threads are not yet started so no protection is required. The function is expected to return non-zero on success, or zero on failure. A failure will make the process emit a succinct error message and immediately exit.
250 lines
7.9 KiB
C
250 lines
7.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <haproxy/init.h>
|
|
#include <haproxy/list.h>
|
|
|
|
/* These functions are called just before a config validity check, which mean
|
|
* they are suited to use them in case we need to generate part of the
|
|
* configuration. It could be used for example to generate a proxy with
|
|
* multiple servers using the configuration parser itself. At this step the
|
|
* trash buffers are allocated.
|
|
* The functions must return 0 on success, or a combination
|
|
* of ERR_* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause
|
|
* and immediate exit, so the function must have emitted any useful error.
|
|
*/
|
|
struct list pre_check_list = LIST_HEAD_INIT(pre_check_list);
|
|
|
|
/* These functions are called just after the point where the program exits
|
|
* after a config validity check, so they are generally suited for resource
|
|
* allocation and slow initializations that should be skipped during basic
|
|
* config checks. The functions must return 0 on success, or a combination
|
|
* of ERR_* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause
|
|
* and immediate exit, so the function must have emitted any useful error.
|
|
*/
|
|
struct list post_check_list = LIST_HEAD_INIT(post_check_list);
|
|
|
|
/* These functions are called for each proxy just after the config validity
|
|
* check. The functions must return 0 on success, or a combination of ERR_*
|
|
* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate
|
|
* exit, so the function must have emitted any useful error.
|
|
*/
|
|
struct list post_proxy_check_list = LIST_HEAD_INIT(post_proxy_check_list);
|
|
|
|
/* These functions are called for each server just after the config validity
|
|
* check. The functions must return 0 on success, or a combination of ERR_*
|
|
* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate
|
|
* exit, so the function must have emitted any useful error.
|
|
*/
|
|
struct list post_server_check_list = LIST_HEAD_INIT(post_server_check_list);
|
|
|
|
/* These functions are called for each thread just after the thread creation
|
|
* and before running the init functions. They should be used to do per-thread
|
|
* (re-)allocations that are needed by subsequent functoins. They must return 0
|
|
* if an error occurred. */
|
|
struct list per_thread_alloc_list = LIST_HEAD_INIT(per_thread_alloc_list);
|
|
|
|
/* These functions are called for each thread just after the thread creation
|
|
* and before running the scheduler. They should be used to do per-thread
|
|
* initializations. They must return 0 if an error occurred. */
|
|
struct list per_thread_init_list = LIST_HEAD_INIT(per_thread_init_list);
|
|
|
|
/* These functions are called when freeing the global sections at the end of
|
|
* deinit, after everything is stopped. They don't return anything. They should
|
|
* not release shared resources that are possibly used by other deinit
|
|
* functions, only close/release what is private. Use the per_thread_free_list
|
|
* to release shared resources.
|
|
*/
|
|
struct list post_deinit_list = LIST_HEAD_INIT(post_deinit_list);
|
|
|
|
/* These functions are called when freeing a proxy during the deinit, after
|
|
* everything isg stopped. They don't return anything. They should not release
|
|
* the proxy itself or any shared resources that are possibly used by other
|
|
* deinit functions, only close/release what is private.
|
|
*/
|
|
struct list proxy_deinit_list = LIST_HEAD_INIT(proxy_deinit_list);
|
|
|
|
/* These functions are called when freeing a server during the deinit, after
|
|
* everything isg stopped. They don't return anything. They should not release
|
|
* the proxy itself or any shared resources that are possibly used by other
|
|
* deinit functions, only close/release what is private.
|
|
*/
|
|
struct list server_deinit_list = LIST_HEAD_INIT(server_deinit_list);
|
|
|
|
/* These functions are called when freeing the global sections at the end of
|
|
* deinit, after the thread deinit functions, to release unneeded memory
|
|
* allocations. They don't return anything, and they work in best effort mode
|
|
* as their sole goal is to make valgrind mostly happy.
|
|
*/
|
|
struct list per_thread_free_list = LIST_HEAD_INIT(per_thread_free_list);
|
|
|
|
/* These functions are called for each thread just after the scheduler loop and
|
|
* before exiting the thread. They don't return anything and, as for post-deinit
|
|
* functions, they work in best effort mode as their sole goal is to make
|
|
* valgrind mostly happy. */
|
|
struct list per_thread_deinit_list = LIST_HEAD_INIT(per_thread_deinit_list);
|
|
|
|
/* used to register some initialization functions to call before the checks. */
|
|
void hap_register_pre_check(int (*fct)())
|
|
{
|
|
struct pre_check_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&pre_check_list, &b->list);
|
|
}
|
|
|
|
/* used to register some initialization functions to call after the checks. */
|
|
void hap_register_post_check(int (*fct)())
|
|
{
|
|
struct post_check_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&post_check_list, &b->list);
|
|
}
|
|
|
|
/* used to register some initialization functions to call for each proxy after
|
|
* the checks.
|
|
*/
|
|
void hap_register_post_proxy_check(int (*fct)(struct proxy *))
|
|
{
|
|
struct post_proxy_check_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&post_proxy_check_list, &b->list);
|
|
}
|
|
|
|
/* used to register some initialization functions to call for each server after
|
|
* the checks.
|
|
*/
|
|
void hap_register_post_server_check(int (*fct)(struct server *))
|
|
{
|
|
struct post_server_check_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&post_server_check_list, &b->list);
|
|
}
|
|
|
|
/* used to register some de-initialization functions to call after everything
|
|
* has stopped.
|
|
*/
|
|
void hap_register_post_deinit(void (*fct)())
|
|
{
|
|
struct post_deinit_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&post_deinit_list, &b->list);
|
|
}
|
|
|
|
/* used to register some per proxy de-initialization functions to call after
|
|
* everything has stopped.
|
|
*/
|
|
void hap_register_proxy_deinit(void (*fct)(struct proxy *))
|
|
{
|
|
struct proxy_deinit_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&proxy_deinit_list, &b->list);
|
|
}
|
|
|
|
/* used to register some per server de-initialization functions to call after
|
|
* everything has stopped.
|
|
*/
|
|
void hap_register_server_deinit(void (*fct)(struct server *))
|
|
{
|
|
struct server_deinit_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&server_deinit_list, &b->list);
|
|
}
|
|
|
|
/* used to register some allocation functions to call for each thread. */
|
|
void hap_register_per_thread_alloc(int (*fct)())
|
|
{
|
|
struct per_thread_alloc_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&per_thread_alloc_list, &b->list);
|
|
}
|
|
|
|
/* used to register some initialization functions to call for each thread. */
|
|
void hap_register_per_thread_init(int (*fct)())
|
|
{
|
|
struct per_thread_init_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&per_thread_init_list, &b->list);
|
|
}
|
|
|
|
/* used to register some de-initialization functions to call for each thread. */
|
|
void hap_register_per_thread_deinit(void (*fct)())
|
|
{
|
|
struct per_thread_deinit_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&per_thread_deinit_list, &b->list);
|
|
}
|
|
|
|
/* used to register some free functions to call for each thread. */
|
|
void hap_register_per_thread_free(void (*fct)())
|
|
{
|
|
struct per_thread_free_fct *b;
|
|
|
|
b = calloc(1, sizeof(*b));
|
|
if (!b) {
|
|
fprintf(stderr, "out of memory\n");
|
|
exit(1);
|
|
}
|
|
b->fct = fct;
|
|
LIST_APPEND(&per_thread_free_list, &b->list);
|
|
}
|