Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
b56837a0
Commit
b56837a0
authored
Jan 20, 2016
by
Victor Stinner
Browse files
Options
Browse Files
Download
Plain Diff
Merge 3.5
Issue #26154: Add a new private _PyThreadState_UncheckedGet() function.
parents
5ccbf79e
bfd316e7
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
42 additions
and
26 deletions
+42
-26
Include/pystate.h
Include/pystate.h
+10
-0
Misc/NEWS
Misc/NEWS
+7
-0
Modules/faulthandler.c
Modules/faulthandler.c
+1
-1
Objects/dictobject.c
Objects/dictobject.c
+2
-4
Python/errors.c
Python/errors.c
+1
-7
Python/pystate.c
Python/pystate.c
+20
-13
Python/sysmodule.c
Python/sysmodule.c
+1
-1
No files found.
Include/pystate.h
View file @
b56837a0
...
...
@@ -168,7 +168,17 @@ PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
PyAPI_FUNC
(
void
)
_PyGILState_Reinit
(
void
);
#endif
/* Return the current thread state. The global interpreter lock must be held.
* When the current thread state is NULL, this issues a fatal error (so that
* the caller needn't check for NULL). */
PyAPI_FUNC
(
PyThreadState
*
)
PyThreadState_Get
(
void
);
#ifdef WITH_THREAD
/* Similar to PyThreadState_Get(), but don't issue a fatal error
* if it is NULL. */
PyAPI_FUNC
(
PyThreadState
*
)
_PyThreadState_UncheckedGet
(
void
);
#endif
PyAPI_FUNC
(
PyThreadState
*
)
PyThreadState_Swap
(
PyThreadState
*
);
PyAPI_FUNC
(
PyObject
*
)
PyThreadState_GetDict
(
void
);
PyAPI_FUNC
(
int
)
PyThreadState_SetAsyncExc
(
long
,
PyObject
*
);
...
...
Misc/NEWS
View file @
b56837a0
...
...
@@ -10,6 +10,13 @@ Release date: tba
Core and Builtins
-----------------
- Issue #26154: Add a new private _PyThreadState_UncheckedGet() function to get
the current Python thread state, but don'
t
issue
a
fatal
error
if
it
is
NULL
.
This
new
function
must
be
used
instead
of
accessing
directly
the
_PyThreadState_Current
variable
.
The
variable
is
no
more
exposed
since
Python
3.5.1
to
hide
the
exact
implementation
of
atomic
C
types
,
to
avoid
compiler
issues
.
-
Issue
#
25791
:
Trying
to
resolve
a
relative
import
without
__spec__
or
__package__
defined
now
raises
an
ImportWarning
...
...
Modules/faulthandler.c
View file @
b56837a0
...
...
@@ -490,7 +490,7 @@ faulthandler_thread(void *unused)
assert
(
st
==
PY_LOCK_FAILURE
);
/* get the thread holding the GIL, NULL if no thread hold the GIL */
current
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
current
=
_PyThreadState_UncheckedGet
(
);
_Py_write_noraise
(
thread
.
fd
,
thread
.
header
,
(
int
)
thread
.
header_len
);
...
...
Objects/dictobject.c
View file @
b56837a0
...
...
@@ -1064,8 +1064,7 @@ PyDict_GetItem(PyObject *op, PyObject *key)
Let's just hope that no exception occurs then... This must be
_PyThreadState_Current and not PyThreadState_GET() because in debug
mode, the latter complains if tstate is NULL. */
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
tstate
=
_PyThreadState_UncheckedGet
();
if
(
tstate
!=
NULL
&&
tstate
->
curexc_type
!=
NULL
)
{
/* preserve the existing exception */
PyObject
*
err_type
,
*
err_value
,
*
err_tb
;
...
...
@@ -1102,8 +1101,7 @@ _PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
Let's just hope that no exception occurs then... This must be
_PyThreadState_Current and not PyThreadState_GET() because in debug
mode, the latter complains if tstate is NULL. */
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
tstate
=
_PyThreadState_UncheckedGet
();
if
(
tstate
!=
NULL
&&
tstate
->
curexc_type
!=
NULL
)
{
/* preserve the existing exception */
PyObject
*
err_type
,
*
err_value
,
*
err_tb
;
...
...
Python/errors.c
View file @
b56837a0
...
...
@@ -152,13 +152,7 @@ PyErr_SetString(PyObject *exception, const char *string)
PyObject
*
PyErr_Occurred
(
void
)
{
/* If there is no thread state, PyThreadState_GET calls
Py_FatalError, which calls PyErr_Occurred. To avoid the
resulting infinite loop, we inline PyThreadState_GET here and
treat no thread as no error. */
PyThreadState
*
tstate
=
((
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
));
PyThreadState
*
tstate
=
_PyThreadState_UncheckedGet
();
return
tstate
==
NULL
?
NULL
:
tstate
->
curexc_type
;
}
...
...
Python/pystate.c
View file @
b56837a0
...
...
@@ -3,6 +3,12 @@
#include "Python.h"
#ifndef Py_BUILD_CORE
/* ensure that PyThreadState_GET() is a macro, not an alias to
* PyThreadState_Get() */
# error "pystate.c must be compiled with Py_BUILD_CORE defined"
#endif
/* --------------------------------------------------------------------------
CAUTION
...
...
@@ -423,7 +429,7 @@ tstate_delete_common(PyThreadState *tstate)
void
PyThreadState_Delete
(
PyThreadState
*
tstate
)
{
if
(
tstate
==
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
))
if
(
tstate
==
PyThreadState_GET
(
))
Py_FatalError
(
"PyThreadState_Delete: tstate is still current"
);
#ifdef WITH_THREAD
if
(
autoInterpreterState
&&
PyThread_get_key_value
(
autoTLSkey
)
==
tstate
)
...
...
@@ -437,8 +443,7 @@ PyThreadState_Delete(PyThreadState *tstate)
void
PyThreadState_DeleteCurrent
()
{
PyThreadState
*
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
PyThreadState
*
tstate
=
PyThreadState_GET
();
if
(
tstate
==
NULL
)
Py_FatalError
(
"PyThreadState_DeleteCurrent: no current tstate"
);
...
...
@@ -488,11 +493,17 @@ _PyThreadState_DeleteExcept(PyThreadState *tstate)
}
PyThreadState
*
_PyThreadState_UncheckedGet
(
void
)
{
return
PyThreadState_GET
();
}
PyThreadState
*
PyThreadState_Get
(
void
)
{
PyThreadState
*
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
PyThreadState
*
tstate
=
PyThreadState_GET
();
if
(
tstate
==
NULL
)
Py_FatalError
(
"PyThreadState_Get: no current thread"
);
...
...
@@ -503,8 +514,7 @@ PyThreadState_Get(void)
PyThreadState
*
PyThreadState_Swap
(
PyThreadState
*
newts
)
{
PyThreadState
*
oldts
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
PyThreadState
*
oldts
=
PyThreadState_GET
();
_Py_atomic_store_relaxed
(
&
_PyThreadState_Current
,
newts
);
/* It should not be possible for more than one thread state
...
...
@@ -535,8 +545,7 @@ PyThreadState_Swap(PyThreadState *newts)
PyObject
*
PyThreadState_GetDict
(
void
)
{
PyThreadState
*
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
PyThreadState
*
tstate
=
PyThreadState_GET
();
if
(
tstate
==
NULL
)
return
NULL
;
...
...
@@ -682,7 +691,7 @@ PyThreadState_IsCurrent(PyThreadState *tstate)
{
/* Must be the tstate for this thread */
assert
(
PyGILState_GetThisThreadState
()
==
tstate
);
return
tstate
==
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
return
tstate
==
PyThreadState_GET
(
);
}
/* Internal initialization/finalization functions called by
...
...
@@ -774,9 +783,7 @@ PyGILState_GetThisThreadState(void)
int
PyGILState_Check
(
void
)
{
/* can't use PyThreadState_Get() since it will assert that it has the GIL */
PyThreadState
*
tstate
=
(
PyThreadState
*
)
_Py_atomic_load_relaxed
(
&
_PyThreadState_Current
);
PyThreadState
*
tstate
=
PyThreadState_GET
();
return
tstate
&&
(
tstate
==
PyGILState_GetThisThreadState
());
}
...
...
Python/sysmodule.c
View file @
b56837a0
...
...
@@ -1396,7 +1396,7 @@ error:
Py_XDECREF
(
name
);
Py_XDECREF
(
value
);
/* No return value, therefore clear error state if possible */
if
(
_Py
_atomic_load_relaxed
(
&
_PyThreadState_Current
))
if
(
_Py
ThreadState_UncheckedGet
(
))
PyErr_Clear
();
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment