Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_fs_fs/fs.c view on Meta::CPAN
#include "svn_fs.h"
#include "svn_delta.h"
#include "svn_version.h"
#include "svn_pools.h"
#include "fs.h"
#include "fs_fs.h"
#include "tree.h"
#include "lock.h"
#include "id.h"
#include "rep-cache.h"
#include "svn_private_config.h"
#include "private/svn_fs_util.h"
#include "private/svn_subr_private.h"
#include "../libsvn_fs/fs-loader.h"
/* A prefix for the pool userdata variables used to hold
per-filesystem shared data. See fs_serialized_init. */
#define SVN_FSFS_SHARED_USERDATA_PREFIX "svn-fsfs-shared-"
static svn_error_t *
fs_serialized_init(svn_fs_t *fs, apr_pool_t *common_pool, apr_pool_t *pool)
{
fs_fs_data_t *ffd = fs->fsap_data;
const char *key;
void *val;
fs_fs_shared_data_t *ffsd;
apr_status_t status;
/* Note that we are allocating a small amount of long-lived data for
each separate repository opened during the lifetime of the
svn_fs_initialize pool. It's unlikely that anyone will notice
the modest expenditure; the alternative is to allocate each structure
in a subpool, add a reference-count, and add a serialized deconstructor
to the FS vtable. That's more machinery than it's worth.
Using the uuid to obtain the lock creates a corner case if a
caller uses svn_fs_set_uuid on the repository in a process where
other threads might be using the same repository through another
FS object. The only real-world consumer of svn_fs_set_uuid is
"svnadmin load", so this is a low-priority problem, and we don't
know of a better way of associating such data with the
repository. */
SVN_ERR_ASSERT(fs->uuid);
key = apr_pstrcat(pool, SVN_FSFS_SHARED_USERDATA_PREFIX, fs->uuid,
(char *) NULL);
status = apr_pool_userdata_get(&val, key, common_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't fetch FSFS shared data"));
ffsd = val;
if (!ffsd)
{
ffsd = apr_pcalloc(common_pool, sizeof(*ffsd));
ffsd->common_pool = common_pool;
/* POSIX fcntl locks are per-process, so we need a mutex for
intra-process synchronization when grabbing the repository write
lock. */
SVN_ERR(svn_mutex__init(&ffsd->fs_write_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* ... not to mention locking the txn-current file. */
SVN_ERR(svn_mutex__init(&ffsd->txn_current_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
/* We also need a mutex for synchronizing access to the active
transaction list and free transaction pointer. This one is
enabled unconditionally. */
SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock,
TRUE, common_pool));
key = apr_pstrdup(common_pool, key);
status = apr_pool_userdata_set(ffsd, key, NULL, common_pool);
if (status)
return svn_error_wrap_apr(status, _("Can't store FSFS shared data"));
}
ffd->shared = ffsd;
return SVN_NO_ERROR;
}
/* This function is provided for Subversion 1.0.x compatibility. It
has no effect for fsfs backed Subversion filesystems. It conforms
to the fs_library_vtable_t.bdb_set_errcall() API. */
static svn_error_t *
fs_set_errcall(svn_fs_t *fs,
void (*db_errcall_fcn)(const char *errpfx, char *msg))
{
return SVN_NO_ERROR;
}
struct fs_freeze_baton_t {
svn_fs_t *fs;
svn_fs_freeze_func_t freeze_func;
void *freeze_baton;
};
static svn_error_t *
fs_freeze_body(void *baton,
apr_pool_t *pool)
{
struct fs_freeze_baton_t *b = baton;
svn_boolean_t exists;
SVN_ERR(svn_fs_fs__exists_rep_cache(&exists, b->fs, pool));
if (exists)
SVN_ERR(svn_fs_fs__lock_rep_cache(b->fs, pool));
SVN_ERR(b->freeze_func(b->freeze_baton, pool));
return SVN_NO_ERROR;
}
static svn_error_t *
fs_freeze(svn_fs_t *fs,
svn_fs_freeze_func_t freeze_func,
void *freeze_baton,
apr_pool_t *pool)
{
struct fs_freeze_baton_t b;
b.fs = fs;
( run in 0.756 second using v1.01-cache-2.11-cpan-d7f47b0818f )