Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_fs_base/bdb/env.c view on Meta::CPAN
/* env.h : managing the BDB environment
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <assert.h>
#include <apr.h>
#if APR_HAS_THREADS
#include <apr_thread_proc.h>
#include <apr_time.h>
#endif
#include <apr_strings.h>
#include <apr_hash.h>
#include "svn_hash.h"
#include "svn_path.h"
#include "svn_pools.h"
#include "svn_utf.h"
#include "private/svn_atomic.h"
#include "private/svn_mutex.h"
#include "bdb-err.h"
#include "bdb_compat.h"
#include "env.h"
/* A note about the BDB environment descriptor cache.
With the advent of DB_REGISTER in BDB-4.4, a process may only open
an environment handle once. This means that we must maintain a
cache of open environment handles, with reference counts. We
allocate each environment descriptor (a bdb_env_t) from its own
pool. The cache itself (and the cache pool) are shared between
threads, so all direct or indirect access to the pool is serialized
with a global mutex.
Because several threads can now use the same DB_ENV handle, we must
use the DB_THREAD flag when opening the environments, otherwise the
env handles (and all of libsvn_fs_base) won't be thread-safe.
If we use DB_THREAD, however, all of the code that reads data from
the database without a cursor must use either DB_DBT_MALLOC,
DB_DBT_REALLOC, or DB_DBT_USERMEM, as described in the BDB
documentation.
(Oh, yes -- using DB_THREAD might not work on some systems. But
then, it's quite probable that threading is seriously broken on
those systems anyway, so we'll rely on APR_HAS_THREADS.)
*/
/* The cache key for a Berkeley DB environment descriptor. This is a
combination of the device ID and INODE number of the Berkeley DB
config file.
XXX FIXME: Although the dev+inode combination is supposed do be
unique, apparently that's not always the case with some remote
filesystems. We /should/ be safe using this as a unique hash key,
because the database must be on a local filesystem. We can hope,
anyway. */
typedef struct bdb_env_key_t
{
apr_dev_t device;
apr_ino_t inode;
} bdb_env_key_t;
/* The cached Berkeley DB environment descriptor. */
struct bdb_env_t
{
/**************************************************************************/
/* Error Reporting */
/* A (char *) casted pointer to this structure is passed to BDB's
set_errpfx(), which treats it as a NUL-terminated character
string to prefix all BDB error messages. However, svn also
registers bdb_error_gatherer() as an error handler with
set_errcall() which turns off BDB's default printing of errors to
stderr and anytime thereafter when BDB reports an error and
before the BDB function returns, it calls bdb_error_gatherer()
and passes the same error prefix (char *) pointer given to
set_errpfx(). The bdb_error_gatherer() callback casts the
(char *) it back to a (bdb_env_t *).
To avoid problems should BDB ever try to interpret our baton as a
string, the first field in the structure is a char
errpfx_string[]. Initializers of this structure must strcpy the
value of BDB_ERRPFX_STRING into this array. */
char errpfx_string[sizeof(BDB_ERRPFX_STRING)];
/* Extended error information. */
#if APR_HAS_THREADS
apr_threadkey_t *error_info; /* Points to a bdb_error_info_t. */
#else
bdb_error_info_t error_info;
#endif
/**************************************************************************/
/* BDB Environment Cache */
/* The Berkeley DB environment. */
DB_ENV *env;
( run in 1.309 second using v1.01-cache-2.11-cpan-1edf4fed603 )