summaryrefslogtreecommitdiff
path: root/Python/thread.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-12-13 04:14:41 +0100
committerVictor Stinner <victor.stinner@gmail.com>2013-12-13 04:14:41 +0100
commit441adb8c5782de6fcf71ee3396d114c48cd1cb5b (patch)
treebdfac5137aa3cb90da5df29bd6bfd8345acd3adb /Python/thread.c
parent775632ba107fb37dfe2d38a39e129f1daad070cf (diff)
downloadcpython-git-441adb8c5782de6fcf71ee3396d114c48cd1cb5b.tar.gz
Backout changeset 46393019b650
test_capi is failing and the fix is not trivial, I prefer to revert
Diffstat (limited to 'Python/thread.c')
-rw-r--r--Python/thread.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/Python/thread.c b/Python/thread.c
index 5396ca30e3..8540942e28 100644
--- a/Python/thread.c
+++ b/Python/thread.c
@@ -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;