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
441adb8c
Commit
441adb8c
authored
Dec 13, 2013
by
Victor Stinner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Backout changeset 46393019b650
test_capi is failing and the fix is not trivial, I prefer to revert
parent
775632ba
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
30 additions
and
24 deletions
+30
-24
Doc/whatsnew/3.4.rst
Doc/whatsnew/3.4.rst
+0
-5
Misc/NEWS
Misc/NEWS
+0
-4
Modules/_testcapimodule.c
Modules/_testcapimodule.c
+0
-4
Modules/_tracemalloc.c
Modules/_tracemalloc.c
+6
-3
Python/thread.c
Python/thread.c
+12
-8
Python/thread_nt.h
Python/thread_nt.h
+9
-0
Python/thread_pthread.h
Python/thread_pthread.h
+3
-0
No files found.
Doc/whatsnew/3.4.rst
View file @
441adb8c
...
...
@@ -1068,8 +1068,3 @@ that may require changes to your code.
working directory will also now have an absolute path, including when using
``-m`` with the interpreter (this does not influence when the path to a file
is specified on the command-line).
* (C API) :c:func:`PyThread_set_key_value` now always set the value. In Python
3.3, the function did nothing if the key already exists (if the current
value is a non-NULL pointer).
Misc/NEWS
View file @
441adb8c
...
...
@@ -10,10 +10,6 @@ Release date: 2014-01-05
Core and Builtins
-----------------
- Issue #19787: PyThread_set_key_value() now always set the value. In Python
3.3, the function did nothing if the key already exists (if the current value
is a non-NULL pointer).
- Issue #14432: Remove the thread state field from the frame structure. Fix a
crash when a generator is created in a C thread that is destroyed while the
generator is still used. The issue was that a generator contains a frame, and
...
...
Modules/_testcapimodule.c
View file @
441adb8c
...
...
@@ -2511,10 +2511,6 @@ run_in_subinterp(PyObject *self, PyObject *args)
r
=
PyRun_SimpleString
(
code
);
Py_EndInterpreter
(
substate
);
/* restore previous thread safe. It was replaced by Py_NewInterpreter()
which creates a new thread state. */
_PyThreadState_Init
(
mainstate
);
PyThreadState_Swap
(
mainstate
);
return
PyLong_FromLong
(
r
);
...
...
Modules/_tracemalloc.c
View file @
441adb8c
...
...
@@ -168,11 +168,14 @@ set_reentrant(int reentrant)
assert
(
reentrant
==
0
||
reentrant
==
1
);
if
(
reentrant
)
{
assert
(
PyThread_get_key_value
(
tracemalloc_reentrant_key
)
==
NULL
);
PyThread_set_key_value
(
tracemalloc_reentrant_key
,
REENTRANT
);
PyThread_set_key_value
(
tracemalloc_reentrant_key
,
REENTRANT
);
}
else
{
assert
(
PyThread_get_key_value
(
tracemalloc_reentrant_key
)
==
REENTRANT
);
PyThread_set_key_value
(
tracemalloc_reentrant_key
,
NULL
);
/* FIXME: PyThread_set_key_value() cannot be used to set the flag
to zero, because it does nothing if the variable has already
a value set. */
PyThread_delete_key_value
(
tracemalloc_reentrant_key
);
}
}
...
...
Python/thread.c
View file @
441adb8c
...
...
@@ -205,7 +205,7 @@ static int nkeys = 0; /* PyThread_create_key() hands out nkeys+1 next */
* segfaults. Now we lock the whole routine.
*/
static
struct
key
*
find_key
(
int
key
,
int
update
,
void
*
value
)
find_key
(
int
key
,
void
*
value
)
{
struct
key
*
p
,
*
prev_p
;
long
id
=
PyThread_get_thread_ident
();
...
...
@@ -215,11 +215,8 @@ find_key(int key, int update, void *value)
PyThread_acquire_lock
(
keymutex
,
1
);
prev_p
=
NULL
;
for
(
p
=
keyhead
;
p
!=
NULL
;
p
=
p
->
next
)
{
if
(
p
->
id
==
id
&&
p
->
key
==
key
)
{
if
(
update
)
p
->
value
=
value
;
if
(
p
->
id
==
id
&&
p
->
key
==
key
)
goto
Done
;
}
/* Sanity check. These states should never happen but if
* they do we must abort. Otherwise we'll end up spinning in
* in a tight loop with the lock held. A similar check is done
...
...
@@ -230,7 +227,7 @@ find_key(int key, int update, void *value)
if
(
p
->
next
==
keyhead
)
Py_FatalError
(
"tls find_key: circular list(!)"
);
}
if
(
!
update
&&
value
==
NULL
)
{
if
(
value
==
NULL
)
{
assert
(
p
==
NULL
);
goto
Done
;
}
...
...
@@ -282,12 +279,19 @@ PyThread_delete_key(int key)
PyThread_release_lock
(
keymutex
);
}
/* Confusing: If the current thread has an association for key,
* value is ignored, and 0 is returned. Else an attempt is made to create
* an association of key to value for the current thread. 0 is returned
* if that succeeds, but -1 is returned if there's not enough memory
* to create the association. value must not be NULL.
*/
int
PyThread_set_key_value
(
int
key
,
void
*
value
)
{
struct
key
*
p
;
p
=
find_key
(
key
,
1
,
value
);
assert
(
value
!=
NULL
);
p
=
find_key
(
key
,
value
);
if
(
p
==
NULL
)
return
-
1
;
else
...
...
@@ -300,7 +304,7 @@ PyThread_set_key_value(int key, void *value)
void
*
PyThread_get_key_value
(
int
key
)
{
struct
key
*
p
=
find_key
(
key
,
0
,
NULL
);
struct
key
*
p
=
find_key
(
key
,
NULL
);
if
(
p
==
NULL
)
return
NULL
;
...
...
Python/thread_nt.h
View file @
441adb8c
...
...
@@ -389,11 +389,20 @@ PyThread_delete_key(int key)
TlsFree
(
key
);
}
/* We must be careful to emulate the strange semantics implemented in thread.c,
* where the value is only set if it hasn't been set before.
*/
int
PyThread_set_key_value
(
int
key
,
void
*
value
)
{
BOOL
ok
;
void
*
oldvalue
;
assert
(
value
!=
NULL
);
oldvalue
=
TlsGetValue
(
key
);
if
(
oldvalue
!=
NULL
)
/* ignore value if already set */
return
0
;
ok
=
TlsSetValue
(
key
,
value
);
if
(
!
ok
)
return
-
1
;
...
...
Python/thread_pthread.h
View file @
441adb8c
...
...
@@ -627,6 +627,9 @@ int
PyThread_set_key_value
(
int
key
,
void
*
value
)
{
int
fail
;
void
*
oldValue
=
pthread_getspecific
(
key
);
if
(
oldValue
!=
NULL
)
return
0
;
fail
=
pthread_setspecific
(
key
,
value
);
return
fail
?
-
1
:
0
;
}
...
...
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