コード例 #1
0
ファイル: root_pools.c プロジェクト: 2asoft/freebsd
/* 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;
}
コード例 #2
0
ファイル: named_atomic.c プロジェクト: ceama/freebsd
/* 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;
}
コード例 #3
0
ファイル: root_pools.c プロジェクト: 2asoft/freebsd
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));
    }
}
コード例 #4
0
ファイル: logger.c プロジェクト: 2asoft/freebsd
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));
    }
}