mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-27 03:20:22 +08:00
dc1961cb15
Similar to the algorithm presented in https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-579.pdf Not completely lock-free at the moment. Also the problems with epoch based memory reclamation are still present - a thread actively observing an epoch getting stuck will prevent LloadConnections and LloadOperations being freed, potentially running out of memory.
165 lines
3.8 KiB
C
165 lines
3.8 KiB
C
/* module_init.c - module initialization functions */
|
|
/* $OpenLDAP$ */
|
|
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
*
|
|
* Copyright 1998-2020 The OpenLDAP Foundation.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted only as authorized by the OpenLDAP
|
|
* Public License.
|
|
*
|
|
* A copy of this license is available in the file LICENSE in the
|
|
* top-level directory of the distribution or, alternatively, at
|
|
* <http://www.OpenLDAP.org/license.html>.
|
|
*/
|
|
/* Portions Copyright (c) 1995 Regents of the University of Michigan.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms are permitted
|
|
* provided that this notice is preserved and that due credit is given
|
|
* to the University of Michigan at Ann Arbor. The name of the University
|
|
* may not be used to endorse or promote products derived from this
|
|
* software without specific prior written permission. This software
|
|
* is provided ``as is'' without express or implied warranty.
|
|
*/
|
|
|
|
#include "portable.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ac/socket.h>
|
|
#include <ac/string.h>
|
|
#include <ac/time.h>
|
|
|
|
#include "../servers/slapd/slap.h"
|
|
#include "../servers/slapd/config.h"
|
|
|
|
#include "lload.h"
|
|
#include "lber_pvt.h"
|
|
|
|
#include "ldap_rq.h"
|
|
|
|
ldap_pvt_thread_t lloadd_main_thread;
|
|
struct lload_conf_info lload_info;
|
|
|
|
void *
|
|
lload_start_daemon( void *arg )
|
|
{
|
|
int rc = 0;
|
|
|
|
daemon_base = event_base_new();
|
|
if ( !daemon_base ) {
|
|
Debug( LDAP_DEBUG_ANY, "lload_start_daemon: "
|
|
"main event base allocation failed\n" );
|
|
rc = 1;
|
|
return (void *)(uintptr_t)rc;
|
|
}
|
|
|
|
rc = lloadd_daemon( daemon_base );
|
|
return (void *)(uintptr_t)rc;
|
|
}
|
|
|
|
static int
|
|
lload_pause_cb( BackendInfo *bi )
|
|
{
|
|
if ( daemon_base ) {
|
|
lload_pause_server();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
lload_unpause_cb( BackendInfo *bi )
|
|
{
|
|
if ( daemon_base ) {
|
|
lload_unpause_server();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
lload_back_open( BackendInfo *bi )
|
|
{
|
|
if ( slapMode & SLAP_TOOL_MODE ) {
|
|
return 0;
|
|
}
|
|
|
|
/* This will fail if we ever try to instantiate more than one lloadd within
|
|
* the process */
|
|
epoch_init();
|
|
|
|
if ( lload_tls_init() != 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
if ( lload_monitor_open() != 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
assert( lloadd_get_listeners() );
|
|
|
|
return ldap_pvt_thread_create(
|
|
&lloadd_main_thread, 0, lload_start_daemon, NULL );
|
|
}
|
|
|
|
int
|
|
lload_back_close( BackendInfo *bi )
|
|
{
|
|
if ( slapMode & SLAP_TOOL_MODE ) {
|
|
return 0;
|
|
}
|
|
|
|
ldap_pvt_thread_mutex_lock( &lload_wait_mutex );
|
|
event_base_loopexit( daemon_base, NULL );
|
|
ldap_pvt_thread_cond_wait( &lload_wait_cond, &lload_wait_mutex );
|
|
ldap_pvt_thread_mutex_unlock( &lload_wait_mutex );
|
|
ldap_pvt_thread_join( lloadd_main_thread, (void *)NULL );
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
lload_back_initialize( BackendInfo *bi )
|
|
{
|
|
bi->bi_flags = SLAP_BFLAG_STANDALONE;
|
|
bi->bi_open = lload_back_open;
|
|
bi->bi_config = config_generic_wrapper;
|
|
bi->bi_pause = lload_pause_cb;
|
|
bi->bi_unpause = lload_unpause_cb;
|
|
bi->bi_close = lload_back_close;
|
|
bi->bi_destroy = 0;
|
|
|
|
bi->bi_db_init = 0;
|
|
bi->bi_db_config = 0;
|
|
bi->bi_db_open = 0;
|
|
bi->bi_db_close = 0;
|
|
bi->bi_db_destroy = 0;
|
|
|
|
bi->bi_op_bind = 0;
|
|
bi->bi_op_unbind = 0;
|
|
bi->bi_op_search = 0;
|
|
bi->bi_op_compare = 0;
|
|
bi->bi_op_modify = 0;
|
|
bi->bi_op_modrdn = 0;
|
|
bi->bi_op_add = 0;
|
|
bi->bi_op_delete = 0;
|
|
bi->bi_op_abandon = 0;
|
|
|
|
bi->bi_extended = 0;
|
|
|
|
bi->bi_chk_referrals = 0;
|
|
|
|
bi->bi_connection_init = 0;
|
|
bi->bi_connection_destroy = 0;
|
|
|
|
if ( lload_global_init() ) {
|
|
return -1;
|
|
}
|
|
|
|
bi->bi_private = &lload_info;
|
|
return lload_back_init_cf( bi );
|
|
}
|
|
|
|
SLAP_BACKEND_INIT_MODULE( lload )
|