[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