Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c view on Meta::CPAN
/*
* swigutil_py.c: utility functions for the SWIG Python bindings
*
* ====================================================================
* 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.
* ====================================================================
*/
/* Tell swigutil_py.h that we're inside the implementation */
#define SVN_SWIG_SWIGUTIL_PY_C
#include <Python.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <apr_pools.h>
#include <apr_hash.h>
#include <apr_portable.h>
#include <apr_thread_proc.h>
#include "svn_hash.h"
#include "svn_client.h"
#include "svn_string.h"
#include "svn_opt.h"
#include "svn_delta.h"
#include "svn_auth.h"
#include "svn_props.h"
#include "svn_pools.h"
#include "svn_mergeinfo.h"
#include "svn_types.h"
#include "svn_private_config.h" /* for SVN_APR_INT64_T_PYCFMT */
#include "swig_python_external_runtime.swg"
#include "swigutil_py.h"
/* Py_ssize_t for old Pythons */
/* This code is as recommended by: */
/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef int Py_ssize_t;
# define PY_SSIZE_T_MAX INT_MAX
# define PY_SSIZE_T_MIN INT_MIN
#endif
/*** Manage the Global Interpreter Lock ***/
/* If both Python and APR have threads available, we can optimize ourselves
* by releasing the global interpreter lock when we drop into our SVN calls.
*
* In svn_types.i, svn_swig_py_release_py_lock is called before every
* function, then svn_swig_py_acquire_py_lock is called after every
* function. So, if these functions become no-ops, then Python will
* start to block...
*
* The Subversion libraries can be assumed to be thread-safe *only* when
* APR_HAS_THREAD is 1. The APR pool allocations aren't thread-safe unless
* APR_HAS_THREAD is 1.
*/
#if defined(WITH_THREAD) && APR_HAS_THREADS
#define ACQUIRE_PYTHON_LOCK
#endif
#ifdef ACQUIRE_PYTHON_LOCK
static apr_threadkey_t *_saved_thread_key = NULL;
static apr_pool_t *_saved_thread_pool = NULL;
#endif
void svn_swig_py_release_py_lock(void)
{
#ifdef ACQUIRE_PYTHON_LOCK
PyThreadState *thread_state;
if (_saved_thread_key == NULL)
{
/* Obviously, creating a top-level pool for this is pretty stupid. */
apr_pool_create(&_saved_thread_pool, NULL);
apr_threadkey_private_create(&_saved_thread_key, NULL,
_saved_thread_pool);
}
thread_state = PyEval_SaveThread();
apr_threadkey_private_set(thread_state, _saved_thread_key);
#endif
}
void svn_swig_py_acquire_py_lock(void)
{
#ifdef ACQUIRE_PYTHON_LOCK
void *val;
PyThreadState *thread_state;
apr_threadkey_private_get(&val, _saved_thread_key);
thread_state = val;
PyEval_RestoreThread(thread_state);
#endif
}
/*** Automatic Pool Management Functions ***/
/* The application pool */
static apr_pool_t *application_pool = NULL;
static PyObject *application_py_pool = NULL;
static char assertValid[] = "assert_valid";
static char markValid[] = "_mark_valid";
static char parentPool[] = "_parent_pool";
static char wrap[] = "_wrap";
static char unwrap[] = "_unwrap";
static char setParentPool[] = "set_parent_pool";
static char emptyTuple[] = "()";
static char objectTuple[] = "(O)";
apr_status_t svn_swig_py_initialize(void)
{
apr_status_t status;
if ((status = apr_initialize()) != APR_SUCCESS)
return status;
if (atexit(apr_terminate) != 0)
return APR_EGENERAL;
return APR_SUCCESS;
}
int svn_swig_py_get_pool_arg(PyObject *args, swig_type_info *type,
PyObject **py_pool, apr_pool_t **pool)
{
int argnum = PyTuple_GET_SIZE(args) - 1;
if (argnum >= 0)
{
PyObject *input = PyTuple_GET_ITEM(args, argnum);
if (input != Py_None && PyObject_HasAttrString(input, markValid))
{
*pool = svn_swig_MustGetPtr(input, type, argnum+1);
if (*pool == NULL)
return 1;
*py_pool = input;
Py_INCREF(input);
return 0;
}
}
/* We couldn't find a pool argument, so we'll create a subpool */
*pool = svn_pool_create(application_pool);
*py_pool = svn_swig_NewPointerObj(*pool, type, application_py_pool,
NULL);
if (*py_pool == NULL)
return 1;
return 0;
}
( run in 1.381 second using v1.01-cache-2.11-cpan-98e64b0badf )