From dcb0ab51583ba81716e2fdc8a91ec1c28f31c0c5 Mon Sep 17 00:00:00 2001 From: Nick Kew Date: Wed, 16 Nov 2005 15:30:32 +0000 Subject: [PATCH] Fix (Chris Darroch) to register cleanup for persistent connection in the no-threads case. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@345040 13f79535-47bb-0310-9956-ffa450edef68 --- modules/database/mod_dbd.c | 43 ++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/modules/database/mod_dbd.c b/modules/database/mod_dbd.c index 932ca4a931..1144fba53b 100644 --- a/modules/database/mod_dbd.c +++ b/modules/database/mod_dbd.c @@ -76,7 +76,7 @@ static const char *dbd_param(cmd_parms *cmd, void *cfg, const char *val) svr->name = val; /* loading the driver involves once-only dlloading that is * best done at server startup. This also guarantees that - * load_driver won't return an error later. + * we won't return an error later. */ switch (apr_dbd_get_driver(cmd->pool, svr->name, &driver)) { case APR_ENOTIMPL: @@ -298,6 +298,23 @@ static apr_status_t dbd_setup(apr_pool_t *pool, server_rec *s) - open acquires a connection from the pool (opens one if necessary) - close releases it back in to the pool */ +void ap_dbd_close(server_rec *s, ap_dbd_t *sql) +{ + svr_cfg *svr = ap_get_module_config(s->module_config, &dbd_module); + if (!svr->persist) { + apr_dbd_close(sql->driver, sql->handle); + } +#if APR_HAS_THREADS + else { + apr_reslist_release(svr->dbpool, sql); + } +#endif +} +static apr_status_t dbd_close(void *CONN) +{ + ap_dbd_t *conn = CONN; + return apr_dbd_close(conn->driver, conn->handle); +} #define arec ((ap_dbd_t*)rec) #if APR_HAS_THREADS ap_dbd_t* ap_dbd_open(apr_pool_t *pool, server_rec *s) @@ -366,29 +383,15 @@ ap_dbd_t* ap_dbd_open(apr_pool_t *pool, server_rec *s) } /* We don't have a connection right now, so we'll open one */ if (!svr->conn) { - rv = dbd_construct(&rec, svr, s->process->pool); - svr->conn = (rv == APR_SUCCESS) ? arec : NULL; + if (dbd_construct(&rec, svr, s->process->pool) == APR_SUCCESS) { + svr->conn = arec ; + apr_pool_cleanup_register(s->process->pool, svr->conn, + dbd_close, apr_pool_cleanup_null); + } } return svr->conn; } #endif -void ap_dbd_close(server_rec *s, ap_dbd_t *sql) -{ - svr_cfg *svr = ap_get_module_config(s->module_config, &dbd_module); - if (!svr->persist) { - apr_dbd_close(sql->driver, sql->handle); - } -#if APR_HAS_THREADS - else { - apr_reslist_release(svr->dbpool, sql); - } -#endif -} -static apr_status_t dbd_close(void *CONN) -{ - ap_dbd_t *conn = CONN; - return apr_dbd_close(conn->driver, conn->handle); -} #if APR_HAS_THREADS typedef struct { ap_dbd_t *conn; -- 2.40.0