/* Return a currently unused connection pool in *POOL. If no such pool * exists, create a new root pool and return that in *POOL. */ static svn_error_t * acquire_pool_internal(apr_pool_t **pool, svn_root_pools__t *pools) { SVN_ERR(svn_mutex__lock(pools->mutex)); *pool = pools->unused_pools->nelts ? *(apr_pool_t **)apr_array_pop(pools->unused_pools) : apr_allocator_owner_get(svn_pool_create_allocator(FALSE)); SVN_ERR(svn_mutex__unlock(pools->mutex, SVN_NO_ERROR)); return SVN_NO_ERROR; }
/* Utility that acquires our global mutex and converts error types. */ static svn_error_t * lock(struct mutex_t *mutex) { svn_error_t *err; /* Get lock on the filehandle. */ SVN_ERR(svn_mutex__lock(thread_mutex)); err = svn_io_lock_open_file(mutex->lock_file, TRUE, FALSE, mutex->pool); return err ? svn_mutex__unlock(thread_mutex, err) : err; }
void svn_root_pools__release_pool(apr_pool_t *pool, svn_root_pools__t *pools) { svn_error_t *err; svn_pool_clear(pool); err = svn_mutex__lock(pools->mutex); if (err) { svn_error_clear(err); svn_pool_destroy(pool); } else { APR_ARRAY_PUSH(pools->unused_pools, apr_pool_t *) = pool; svn_error_clear(svn_mutex__unlock(pools->mutex, SVN_NO_ERROR)); } }
void logger__log_error(logger_t *logger, svn_error_t *err, repository_t *repository, client_info_t *client_info) { if (logger && err) { const char *timestr, *continuation; const char *user, *repos, *remote_host; char errbuf[256]; /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */ char errstr[8192]; svn_error_clear(svn_mutex__lock(logger->mutex)); timestr = svn_time_to_cstring(apr_time_now(), logger->pool); remote_host = client_info && client_info->remote_host ? client_info->remote_host : "-"; user = client_info && client_info->user ? client_info->user : "******"; repos = repository && repository->repos_name ? repository->repos_name : "-"; continuation = ""; while (err) { const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf)); /* based on httpd-2.2.4/server/log.c:log_error_core */ apr_size_t len = apr_snprintf(errstr, sizeof(errstr), "%" APR_PID_T_FMT " %s %s %s %s ERR%s %s %ld %d ", getpid(), timestr, remote_host, user, repos, continuation, err->file ? err->file : "-", err->line, err->apr_err); len += escape_errorlog_item(errstr + len, message, sizeof(errstr) - len); /* Truncate for the terminator (as apr_snprintf does) */ if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) { len = sizeof(errstr) - sizeof(APR_EOL_STR); } memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR)); len += sizeof(APR_EOL_STR) -1; /* add NL, ex terminating NUL */ svn_error_clear(svn_stream_write(logger->stream, errstr, &len)); continuation = "-"; err = err->child; } svn_pool_clear(logger->pool); svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR)); } }