From: Lisandro Dalcin Date: Fri, 1 Apr 2011 01:08:58 +0000 (-0300) Subject: profile nogil functions: warning instead of error X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=70a90e81cbf893b94bb5cebf94ad7e97ec84fac0;p=cython.git profile nogil functions: warning instead of error --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 7b91add2..358c067f 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1252,9 +1252,10 @@ class FuncDefNode(StatNode, BlockNode): preprocessor_guard = None profile = code.globalstate.directives['profile'] + if profile and lenv.nogil: + warning(self.pos, "Cannot profile nogil function.", 1) + profile = False if profile: - if lenv.nogil: - error(self.pos, "Cannot profile nogil function.") code.globalstate.use_utility_code(profile_utility_code) # Generate C code for header and body of function diff --git a/tests/run/pstats_profile_test.pyx b/tests/run/pstats_profile_test.pyx index f9d2d5c3..e9edee96 100644 --- a/tests/run/pstats_profile_test.pyx +++ b/tests/run/pstats_profile_test.pyx @@ -20,6 +20,23 @@ __doc__ = u""" KeyError: 'f_noprof' >>> short_stats['f_raise'] 100 + + >>> short_stats['withgil_prof'] + 100 + >>> short_stats['withgil_noprof'] + Traceback (most recent call last): + ... + KeyError: 'withgil_noprof' + + >>> short_stats['nogil_prof'] + Traceback (most recent call last): + ... + KeyError: 'nogil_prof' + >>> short_stats['nogil_noprof'] + Traceback (most recent call last): + ... + KeyError: 'nogil_noprof' + >>> try: ... os.unlink(statsfile) ... except: @@ -43,6 +60,10 @@ def test_profile(long N): n += f_inline(i) n += f_inline_prof(i) n += f_noprof(i) + n += nogil_noprof(i) + n += nogil_prof(i) + n += withgil_noprof(i) + n += withgil_prof(i) try: n += f_raise(i+2) except RuntimeError: @@ -68,3 +89,18 @@ cdef int f_noprof(long a): cdef long f_raise(long) except -2: raise RuntimeError + +@cython.profile(False) +cdef int withgil_noprof(long a) with gil: + return (a) +@cython.profile(True) +cdef int withgil_prof(long a) with gil: + return (a) + +@cython.profile(False) +cdef int nogil_noprof(long a) nogil: + return a +@cython.profile(True) +cdef int nogil_prof(long a) nogil: + return a +