[Lxml-checkins] r49273 - lxml/trunk/src/lxml
scoder at codespeak.net
scoder at codespeak.net
Sun Dec 2 13:30:07 CET 2007
Author: scoder
Date: Sun Dec 2 13:30:07 2007
New Revision: 49273
Modified:
lxml/trunk/src/lxml/cstd.pxd
lxml/trunk/src/lxml/lxml.etree.pyx
lxml/trunk/src/lxml/parser.pxi
lxml/trunk/src/lxml/python.pxd
lxml/trunk/src/lxml/xmlerror.pxi
lxml/trunk/src/lxml/xpath.pxi
lxml/trunk/src/lxml/xslt.pxi
Log:
use 'with gil/nogil' where appropriate instead of acuiring/releasing the GIL by hand
Modified: lxml/trunk/src/lxml/cstd.pxd
==============================================================================
--- lxml/trunk/src/lxml/cstd.pxd (original)
+++ lxml/trunk/src/lxml/cstd.pxd Sun Dec 2 13:30:07 2007
@@ -15,6 +15,10 @@
cdef void* memcpy(void* dest, void* src, size_t len)
cdef void* memset(void* s, int c, size_t len)
+cdef extern from "stdlib.h":
+ cdef void* malloc(size_t size)
+ cdef void free(void* ptr)
+
cdef extern from "stdarg.h":
ctypedef void *va_list
void va_start(va_list ap, void *last)
Modified: lxml/trunk/src/lxml/lxml.etree.pyx
==============================================================================
--- lxml/trunk/src/lxml/lxml.etree.pyx (original)
+++ lxml/trunk/src/lxml/lxml.etree.pyx Sun Dec 2 13:30:07 2007
@@ -1181,7 +1181,6 @@
cdef _Element NEW_ELEMENT "PY_NEW" (object t)
cdef _Element _elementFactory(_Document doc, xmlNode* c_node):
- cdef python.PyThreadState* state
cdef _Element result
result = getProxy(c_node)
if result is not None:
@@ -1190,9 +1189,9 @@
return None
if config.ENABLE_THREADING:
- state = python.PyEval_SaveThread()
- python.PyThread_acquire_lock(ELEMENT_CREATION_LOCK, python.WAIT_LOCK)
- python.PyEval_RestoreThread(state)
+ with nogil:
+ python.PyThread_acquire_lock(
+ ELEMENT_CREATION_LOCK, python.WAIT_LOCK)
result = getProxy(c_node)
if result is not None:
python.PyThread_release_lock(ELEMENT_CREATION_LOCK)
Modified: lxml/trunk/src/lxml/parser.pxi
==============================================================================
--- lxml/trunk/src/lxml/parser.pxi (original)
+++ lxml/trunk/src/lxml/parser.pxi Sun Dec 2 13:30:07 2007
@@ -409,13 +409,11 @@
xmlparser.xmlClearParserCtxt(self._c_ctxt)
cdef int prepare(self) except -1:
- cdef python.PyThreadState* state
cdef int result
if config.ENABLE_THREADING and self._lock is not NULL:
- state = python.PyEval_SaveThread()
- result = python.PyThread_acquire_lock(
- self._lock, python.WAIT_LOCK)
- python.PyEval_RestoreThread(state)
+ with nogil:
+ result = python.PyThread_acquire_lock(
+ self._lock, python.WAIT_LOCK)
if result == 0:
raise ParserError, "parser locking failed"
self._error_log.connect()
Modified: lxml/trunk/src/lxml/python.pxd
==============================================================================
--- lxml/trunk/src/lxml/python.pxd (original)
+++ lxml/trunk/src/lxml/python.pxd Sun Dec 2 13:30:07 2007
@@ -95,12 +95,6 @@
cdef object PyErr_NoMemory()
cdef object PyErr_SetFromErrno(object type)
- ctypedef enum PyGILState_STATE:
- PyGILState_LOCKED
- PyGILState_UNLOCKED
-
- cdef PyGILState_STATE PyGILState_Ensure()
- cdef void PyGILState_Release(PyGILState_STATE state)
cdef PyThreadState* PyEval_SaveThread()
cdef void PyEval_RestoreThread(PyThreadState* state)
cdef PyObject* PyThreadState_GetDict()
@@ -109,7 +103,7 @@
ctypedef void* PyThread_type_lock
cdef PyThread_type_lock PyThread_allocate_lock()
cdef void PyThread_free_lock(PyThread_type_lock lock)
- cdef int PyThread_acquire_lock(PyThread_type_lock lock, int mode)
+ cdef int PyThread_acquire_lock(PyThread_type_lock lock, int mode) nogil
cdef void PyThread_release_lock(PyThread_type_lock lock)
cdef long PyThread_get_thread_ident()
Modified: lxml/trunk/src/lxml/xmlerror.pxi
==============================================================================
--- lxml/trunk/src/lxml/xmlerror.pxi (original)
+++ lxml/trunk/src/lxml/xmlerror.pxi Sun Dec 2 13:30:07 2007
@@ -370,7 +370,7 @@
# local log functions: forward error to logger object
-cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error):
+cdef void _forwardError(void* c_log_handler, xmlerror.xmlError* error) with gil:
cdef _BaseErrorLog log_handler
if c_log_handler is not NULL:
log_handler = <_BaseErrorLog>c_log_handler
@@ -378,19 +378,15 @@
log_handler = __GLOBAL_ERROR_LOG
log_handler._receive(error)
-cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error):
+cdef void _receiveError(void* c_log_handler, xmlerror.xmlError* error) nogil:
# no Python objects here, may be called without thread context !
# when we declare a Python object, Pyrex will INCREF(None) !
- cdef python.PyGILState_STATE gil_state
if __DEBUG != 0:
- gil_state = python.PyGILState_Ensure()
_forwardError(c_log_handler, error)
- python.PyGILState_Release(gil_state)
-cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...):
+cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...) nogil:
# no Python objects here, may be called without thread context !
# when we declare a Python object, Pyrex will INCREF(None) !
- cdef python.PyGILState_STATE gil_state
cdef xmlerror.xmlError c_error
cdef cstd.va_list args
cdef char* c_text
@@ -422,7 +418,6 @@
c_element = NULL
cstd.va_end(args)
- gil_state = python.PyGILState_Ensure()
c_message = NULL
if c_text is NULL:
c_error.message = ''
@@ -431,7 +426,7 @@
else:
text_size = cstd.strlen(c_text)
element_size = cstd.strlen(c_element)
- c_message = <char*>python.PyMem_Malloc(
+ c_message = <char*>cstd.malloc(
(text_size + 12 + element_size + 1) * sizeof(char))
cstd.sprintf(c_message, "%s, element '%s'", c_text, c_element)
c_error.message = c_message
@@ -444,8 +439,7 @@
_forwardError(c_log_handler, &c_error)
if c_message is not NULL:
- python.PyMem_Free(c_error.message)
- python.PyGILState_Release(gil_state)
+ cstd.free(c_error.message)
################################################################################
Modified: lxml/trunk/src/lxml/xpath.pxi
==============================================================================
--- lxml/trunk/src/lxml/xpath.pxi (original)
+++ lxml/trunk/src/lxml/xpath.pxi Sun Dec 2 13:30:07 2007
@@ -148,13 +148,11 @@
return c == c'/'
cdef int _lock(self) except -1:
- cdef python.PyThreadState* state
cdef int result
if config.ENABLE_THREADING and self._eval_lock != NULL:
- state = python.PyEval_SaveThread()
- result = python.PyThread_acquire_lock(
- self._eval_lock, python.WAIT_LOCK)
- python.PyEval_RestoreThread(state)
+ with nogil:
+ result = python.PyThread_acquire_lock(
+ self._eval_lock, python.WAIT_LOCK)
if result == 0:
raise ParserError, "parser locking failed"
return 0
Modified: lxml/trunk/src/lxml/xslt.pxi
==============================================================================
--- lxml/trunk/src/lxml/xslt.pxi (original)
+++ lxml/trunk/src/lxml/xslt.pxi Sun Dec 2 13:30:07 2007
@@ -64,16 +64,8 @@
context._parser = parser
context._c_style_doc = NULL
-cdef xmlDoc* _xslt_resolve_stylesheet(char* c_uri, void* context):
- cdef xmlDoc* c_doc
- c_doc = (<_XSLTResolverContext>context)._c_style_doc
- if c_doc is not NULL and c_doc.URL is not NULL:
- if cstd.strcmp(c_uri, c_doc.URL) == 0:
- return _copyDoc(c_doc, 1)
- return NULL
-
cdef xmlDoc* _xslt_resolve_from_python(char* c_uri, void* c_context,
- int parse_options, int* error):
+ int parse_options, int* error) with gil:
# call the Python document loaders
cdef _XSLTResolverContext context
cdef _ResolverRegistry resolvers
@@ -82,6 +74,14 @@
error[0] = 0
context = <_XSLTResolverContext>c_context
+
+ # shortcut if we resolve the stylesheet itself
+ c_doc = context._c_style_doc
+ if c_doc is not NULL and c_doc.URL is not NULL:
+ if cstd.strcmp(c_uri, c_doc.URL) == 0:
+ return _copyDoc(c_doc, 1)
+
+ # delegate to the Python resolvers
try:
resolvers = context._resolvers
if cstd.strncmp('string://', c_uri, 9) == 0:
@@ -115,7 +115,7 @@
return NULL
cdef void _xslt_store_resolver_exception(char* c_uri, void* context,
- xslt.xsltLoadType c_type):
+ xslt.xsltLoadType c_type) with gil:
message = "Cannot resolve URI %s" % c_uri
if c_type == xslt.XSLT_LOAD_DOCUMENT:
exception = XSLTApplyError(message)
@@ -125,14 +125,13 @@
cdef xmlDoc* _xslt_doc_loader(char* c_uri, tree.xmlDict* c_dict,
int parse_options, void* c_ctxt,
- xslt.xsltLoadType c_type):
+ xslt.xsltLoadType c_type) nogil:
# no Python objects here, may be called without thread context !
# when we declare a Python object, Pyrex will INCREF(None) !
cdef xmlDoc* c_doc
cdef xmlDoc* result
cdef void* c_pcontext
cdef int error
- cdef python.PyGILState_STATE gil_state
# find resolver contexts of stylesheet and transformed doc
if c_type == xslt.XSLT_LOAD_DOCUMENT:
# transformation time
@@ -148,14 +147,6 @@
return XSLT_DOC_DEFAULT_LOADER(
c_uri, c_dict, parse_options, c_ctxt, c_type)
- gil_state = python.PyGILState_Ensure()
- c_doc = _xslt_resolve_stylesheet(c_uri, c_pcontext)
- if c_doc is not NULL:
- python.PyGILState_Release(gil_state)
- if c_type == xslt.XSLT_LOAD_STYLESHEET:
- c_doc._private = c_pcontext
- return c_doc
-
c_doc = _xslt_resolve_from_python(c_uri, c_pcontext, parse_options, &error)
if c_doc is NULL and not error:
c_doc = XSLT_DOC_DEFAULT_LOADER(
@@ -163,7 +154,6 @@
if c_doc is NULL:
_xslt_store_resolver_exception(c_uri, c_pcontext, c_type)
- python.PyGILState_Release(gil_state)
if c_doc is not NULL and c_type == xslt.XSLT_LOAD_STYLESHEET:
c_doc._private = c_pcontext
return c_doc
More information about the lxml-checkins
mailing list