annotate Lib/threading.py @ 86127:a3d09c19bb93

merge with 3.3
author Georg Brandl <georg@python.org>
date Sun, 06 Oct 2013 19:24:00 +0200
parents 967af1815967
children 7c56bf5afee6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24833
ca58f5a4558b Docstring nits: The module is neither proposed nor new.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24830
diff changeset
1 """Thread module emulating a subset of Java's threading model."""
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
26905
7ea7637341d0 - prefer "import ... as" to "import / (assignments) / del" for most things
Fred Drake <fdrake@acm.org>
parents: 26883
diff changeset
3 import sys as _sys
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
4 import _thread
26905
7ea7637341d0 - prefer "import ... as" to "import / (assignments) / del" for most things
Fred Drake <fdrake@acm.org>
parents: 26883
diff changeset
5
76597
76d2e0761d18 Issue #14428, #14397: Implement the PEP 418
Victor Stinner <victor.stinner@gmail.com>
parents: 76422
diff changeset
6 from time import sleep as _sleep
76d2e0761d18 Issue #14428, #14397: Implement the PEP 418
Victor Stinner <victor.stinner@gmail.com>
parents: 76422
diff changeset
7 try:
76d2e0761d18 Issue #14428, #14397: Implement the PEP 418
Victor Stinner <victor.stinner@gmail.com>
parents: 76422
diff changeset
8 from time import monotonic as _time
76d2e0761d18 Issue #14428, #14397: Implement the PEP 418
Victor Stinner <victor.stinner@gmail.com>
parents: 76422
diff changeset
9 except ImportError:
76d2e0761d18 Issue #14428, #14397: Implement the PEP 418
Victor Stinner <victor.stinner@gmail.com>
parents: 76422
diff changeset
10 from time import time as _time
30862
d45f8981fdea Add traceback.format_exc().
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 29725
diff changeset
11 from traceback import format_exc as _format_exc
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
12 from _weakrefset import WeakSet
82861
3969797dd598 Fix import
Raymond Hettinger <python@rcn.com>
parents: 82594
diff changeset
13 from itertools import islice as _islice
82592
0f86b51f8f8b Issue #17385: Fix quadratic behavior in threading.Condition
Raymond Hettinger <python@rcn.com>
parents: 82591
diff changeset
14 try:
0f86b51f8f8b Issue #17385: Fix quadratic behavior in threading.Condition
Raymond Hettinger <python@rcn.com>
parents: 82591
diff changeset
15 from _collections import deque as _deque
84442
7769c4d72806 Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents: 84114
diff changeset
16 except ImportError:
82592
0f86b51f8f8b Issue #17385: Fix quadratic behavior in threading.Condition
Raymond Hettinger <python@rcn.com>
parents: 82591
diff changeset
17 from collections import deque as _deque
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
19 # Note regarding PEP 8 compliant names
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
20 # This threading model was originally inspired by Java, and inherited
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
21 # the convention of camelCase function and method names from that
85221
e07f104133d5 #18705: fix a number of typos. Patch by Févry Thibault.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83497
diff changeset
22 # language. Those original names are not in any imminent danger of
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
23 # being deprecated (even for Py3k),so this module provides them as an
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
24 # alias for the PEP 8 compliant names
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
25 # Note that using the new PEP 8 compliant names facilitates substitution
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
26 # with the multiprocessing module, which doesn't provide the old
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
27 # Java inspired names.
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
28
67533
2244ac6c2a9b Add entry for Barrier objects.
Raymond Hettinger <python@rcn.com>
parents: 67354
diff changeset
29 __all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
2244ac6c2a9b Add entry for Barrier objects.
Raymond Hettinger <python@rcn.com>
parents: 67354
diff changeset
30 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
71701
bbeda42ea6a8 add ThreadError to threading.__all__ (closes #12679)
Benjamin Peterson <benjamin@python.org>
parents: 71560
diff changeset
31 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size']
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
32
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 # Rename some stuff so "from threading import *" is safe
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
34 _start_new_thread = _thread.start_new_thread
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
35 _allocate_lock = _thread.allocate_lock
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
36 _set_sentinel = _thread._set_sentinel
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
37 get_ident = _thread.get_ident
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
38 ThreadError = _thread.error
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
39 try:
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
40 _CRLock = _thread.RLock
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
41 except AttributeError:
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
42 _CRLock = None
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
43 TIMEOUT_MAX = _thread.TIMEOUT_MAX
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
44 del _thread
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
47 # Support for profile and trace hooks
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
48
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
49 _profile_hook = None
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
50 _trace_hook = None
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
51
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
52 def setprofile(func):
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
53 global _profile_hook
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
54 _profile_hook = func
29686
371092ce5c2b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 29683
diff changeset
55
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
56 def settrace(func):
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
57 global _trace_hook
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
58 _trace_hook = func
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 # Synchronization classes
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 Lock = _allocate_lock
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
64 def RLock(*args, **kwargs):
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
65 if _CRLock is None:
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
66 return _PyRLock(*args, **kwargs)
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
67 return _CRLock(*args, **kwargs)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
69 class _RLock:
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
70
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
71 def __init__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
72 self._block = _allocate_lock()
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
73 self._owner = None
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
74 self._count = 0
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 def __repr__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
77 owner = self._owner
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
78 try:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
79 owner = _active[owner].name
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
80 except KeyError:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
81 pass
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
82 return "<%s owner=%r count=%d>" % (
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
83 self.__class__.__name__, owner, self._count)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
84
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
85 def acquire(self, blocking=True, timeout=-1):
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
86 me = get_ident()
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
87 if self._owner == me:
82591
28b86525ef07 Update code to increment and decrement using the cleaner += 1 and -= 1 style.
Raymond Hettinger <python@rcn.com>
parents: 76597
diff changeset
88 self._count += 1
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 return 1
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
90 rc = self._block.acquire(blocking, timeout)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 if rc:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
92 self._owner = me
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
93 self._count = 1
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return rc
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
95
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
96 __enter__ = acquire
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
97
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 def release(self):
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
99 if self._owner != get_ident():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
100 raise RuntimeError("cannot release un-acquired lock")
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
101 self._count = count = self._count - 1
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 if not count:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
103 self._owner = None
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
104 self._block.release()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
106 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
107 self.release()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
108
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 # Internal methods used by condition variables
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110
41717
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40809
diff changeset
111 def _acquire_restore(self, state):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
112 self._block.acquire()
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
113 self._count, self._owner = state
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 def _release_save(self):
69543
2c0da1c4f063 Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69457
diff changeset
116 if self._count == 0:
2c0da1c4f063 Issue #11915: threading.RLock()._release_save() raises a RuntimeError if the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69457
diff changeset
117 raise RuntimeError("cannot release un-acquired lock")
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
118 count = self._count
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
119 self._count = 0
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
120 owner = self._owner
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
121 self._owner = None
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
122 self._block.release()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 return (count, owner)
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 def _is_owned(self):
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
126 return self._owner == get_ident()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
128 _PyRLock = _RLock
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
129
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
131 class Condition:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
133 def __init__(self, lock=None):
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 if lock is None:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 lock = RLock()
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
136 self._lock = lock
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 # Export the lock's acquire() and release() methods
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 self.acquire = lock.acquire
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 self.release = lock.release
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 # If the lock defines _release_save() and/or _acquire_restore(),
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 # these override the default implementations (which just call
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 # release() and acquire() on the lock). Ditto for _is_owned().
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 self._release_save = lock._release_save
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 except AttributeError:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 self._acquire_restore = lock._acquire_restore
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 except AttributeError:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 self._is_owned = lock._is_owned
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 except AttributeError:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 pass
82592
0f86b51f8f8b Issue #17385: Fix quadratic behavior in threading.Condition
Raymond Hettinger <python@rcn.com>
parents: 82591
diff changeset
155 self._waiters = _deque()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
156
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
157 def __enter__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
158 return self._lock.__enter__()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
159
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
160 def __exit__(self, *args):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
161 return self._lock.__exit__(*args)
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
162
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 def __repr__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
164 return "<Condition(%s, %d)>" % (self._lock, len(self._waiters))
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 def _release_save(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
167 self._lock.release() # No state to save
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
168
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 def _acquire_restore(self, x):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
170 self._lock.acquire() # Ignore saved state
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
171
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 def _is_owned(self):
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
173 # Return True if lock is owned by current_thread.
24827
e5a07cc81559 Explain a minor mystery.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24058
diff changeset
174 # This method is called only if __lock doesn't have _is_owned().
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
175 if self._lock.acquire(0):
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
176 self._lock.release()
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 21981
diff changeset
177 return False
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 else:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 21981
diff changeset
179 return True
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
180
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 def wait(self, timeout=None):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
182 if not self._is_owned():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
183 raise RuntimeError("cannot wait on un-acquired lock")
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 waiter = _allocate_lock()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 waiter.acquire()
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
186 self._waiters.append(waiter)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 saved_state = self._release_save()
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
188 try: # restore state no matter what (e.g., KeyboardInterrupt)
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
189 if timeout is None:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
190 waiter.acquire()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 63166
diff changeset
191 gotit = True
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 else:
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
193 if timeout > 0:
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
194 gotit = waiter.acquire(True, timeout)
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
195 else:
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
196 gotit = waiter.acquire(False)
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
197 if not gotit:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
198 try:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
199 self._waiters.remove(waiter)
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
200 except ValueError:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
201 pass
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 63166
diff changeset
202 return gotit
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
203 finally:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
204 self._acquire_restore(saved_state)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
205
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
206 def wait_for(self, predicate, timeout=None):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
207 endtime = None
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
208 waittime = timeout
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
209 result = predicate()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
210 while not result:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
211 if waittime is not None:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
212 if endtime is None:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
213 endtime = _time() + waittime
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
214 else:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
215 waittime = endtime - _time()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
216 if waittime <= 0:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
217 break
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
218 self.wait(waittime)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
219 result = predicate()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
220 return result
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
221
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 def notify(self, n=1):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
223 if not self._is_owned():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
224 raise RuntimeError("cannot notify on un-acquired lock")
82594
79943dee0aca Improve variable names
Raymond Hettinger <python@rcn.com>
parents: 82592
diff changeset
225 all_waiters = self._waiters
79943dee0aca Improve variable names
Raymond Hettinger <python@rcn.com>
parents: 82592
diff changeset
226 waiters_to_notify = _deque(_islice(all_waiters, n))
79943dee0aca Improve variable names
Raymond Hettinger <python@rcn.com>
parents: 82592
diff changeset
227 if not waiters_to_notify:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 return
82594
79943dee0aca Improve variable names
Raymond Hettinger <python@rcn.com>
parents: 82592
diff changeset
229 for waiter in waiters_to_notify:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 waiter.release()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 try:
82594
79943dee0aca Improve variable names
Raymond Hettinger <python@rcn.com>
parents: 82592
diff changeset
232 all_waiters.remove(waiter)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 except ValueError:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
235
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
236 def notify_all(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
237 self.notify(len(self._waiters))
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
238
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
239 notifyAll = notify_all
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
240
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
242 class Semaphore:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
243
11876
c27d3e8c45c4 Fix a typo in a comment
Andrew M. Kuchling <amk@amk.ca>
parents: 11707
diff changeset
244 # After Tim Peters' semaphore class, but not quite the same (no maximum)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
245
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
246 def __init__(self, value=1):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
247 if value < 0:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
248 raise ValueError("semaphore initial value must be >= 0")
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
249 self._cond = Condition(Lock())
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
250 self._value = value
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
251
60665
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
252 def acquire(self, blocking=True, timeout=None):
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
253 if not blocking and timeout is not None:
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
254 raise ValueError("can't specify timeout for non-blocking acquire")
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22830
diff changeset
255 rc = False
60665
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
256 endtime = None
83497
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
257 with self._cond:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
258 while self._value == 0:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
259 if not blocking:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
260 break
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
261 if timeout is not None:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
262 if endtime is None:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
263 endtime = _time() + timeout
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
264 else:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
265 timeout = endtime - _time()
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
266 if timeout <= 0:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
267 break
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
268 self._cond.wait(timeout)
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
269 else:
83498
a26df2d03989 Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83030 83497
diff changeset
270 self._value -= 1
83497
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
271 rc = True
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 return rc
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
274 __enter__ = acquire
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
275
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 def release(self):
83497
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
277 with self._cond:
83498
a26df2d03989 Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83030 83497
diff changeset
278 self._value += 1
83497
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
279 self._cond.notify()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
280
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
281 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
282 self.release()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
283
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
285 class BoundedSemaphore(Semaphore):
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
286 """Semaphore that checks that # releases is <= # acquires"""
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
287 def __init__(self, value=1):
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
288 Semaphore.__init__(self, value)
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
289 self._initial_value = value
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
290
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
291 def release(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
292 if self._value >= self._initial_value:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42679
diff changeset
293 raise ValueError("Semaphore released too many times")
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
294 return Semaphore.release(self)
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
295
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
296
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
297 class Event:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
298
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 # After Tim Peters' event class (without is_posted())
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
300
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
301 def __init__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
302 self._cond = Condition(Lock())
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
303 self._flag = False
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
304
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
305 def _reset_internal_locks(self):
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
306 # private! called by Thread._reset_internal_locks by _after_fork()
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
307 self._cond.__init__()
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
308
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
309 def is_set(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
310 return self._flag
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
311
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
312 isSet = is_set
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
313
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 def set(self):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
315 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
316 try:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
317 self._flag = True
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
318 self._cond.notify_all()
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
319 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
320 self._cond.release()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
321
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 def clear(self):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
323 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
324 try:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
325 self._flag = False
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
326 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
327 self._cond.release()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
328
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 def wait(self, timeout=None):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
330 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
331 try:
74292
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 74037
diff changeset
332 signaled = self._flag
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 74037
diff changeset
333 if not signaled:
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 74037
diff changeset
334 signaled = self._cond.wait(timeout)
eb39d862a250 Issue #13502: threading: Fix a race condition in Event.wait() that made it
Charles-François Natali <neologix@free.fr>
parents: 74037
diff changeset
335 return signaled
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
336 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
337 self._cond.release()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
338
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
339
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
340 # A barrier class. Inspired in part by the pthread_barrier_* api and
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
341 # the CyclicBarrier class from Java. See
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
342 # http://sourceware.org/pthreads-win32/manual/pthread_barrier_init.html and
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
343 # http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
344 # CyclicBarrier.html
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
345 # for information.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
346 # We maintain two main states, 'filling' and 'draining' enabling the barrier
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
347 # to be cyclic. Threads are not allowed into it until it has fully drained
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
348 # since the previous cycle. In addition, a 'resetting' state exists which is
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
349 # similar to 'draining' except that threads leave with a BrokenBarrierError,
72985
e19ccbbe70dd Remove duplication.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 71361
diff changeset
350 # and a 'broken' state in which all threads get the exception.
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
351 class Barrier:
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
352 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
353 Barrier. Useful for synchronizing a fixed number of threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
354 at known synchronization points. Threads block on 'wait()' and are
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
355 simultaneously once they have all made that call.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
356 """
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
357 def __init__(self, parties, action=None, timeout=None):
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
358 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
359 Create a barrier, initialised to 'parties' threads.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
360 'action' is a callable which, when supplied, will be called
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
361 by one of the threads after they have all entered the
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
362 barrier and just prior to releasing them all.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
363 If a 'timeout' is provided, it is uses as the default for
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
364 all subsequent 'wait()' calls.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
365 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
366 self._cond = Condition(Lock())
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
367 self._action = action
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
368 self._timeout = timeout
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
369 self._parties = parties
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
370 self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
371 self._count = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
372
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
373 def wait(self, timeout=None):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
374 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
375 Wait for the barrier. When the specified number of threads have
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
376 started waiting, they are all simultaneously awoken. If an 'action'
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
377 was provided for the barrier, one of the threads will have executed
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
378 that callback prior to returning.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
379 Returns an individual index number from 0 to 'parties-1'.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
380 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
381 if timeout is None:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
382 timeout = self._timeout
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
383 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
384 self._enter() # Block while the barrier drains.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
385 index = self._count
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
386 self._count += 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
387 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
388 if index + 1 == self._parties:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
389 # We release the barrier
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
390 self._release()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
391 else:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
392 # We wait until someone releases us
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
393 self._wait(timeout)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
394 return index
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
395 finally:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
396 self._count -= 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
397 # Wake up any threads waiting for barrier to drain.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
398 self._exit()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
399
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
400 # Block until the barrier is ready for us, or raise an exception
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
401 # if it is broken.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
402 def _enter(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
403 while self._state in (-1, 1):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
404 # It is draining or resetting, wait until done
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
405 self._cond.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
406 #see if the barrier is in a broken state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
407 if self._state < 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
408 raise BrokenBarrierError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
409 assert self._state == 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
410
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
411 # Optionally run the 'action' and release the threads waiting
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
412 # in the barrier.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
413 def _release(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
414 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
415 if self._action:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
416 self._action()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
417 # enter draining state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
418 self._state = 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
419 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
420 except:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
421 #an exception during the _action handler. Break and reraise
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
422 self._break()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
423 raise
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
424
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
425 # Wait in the barrier until we are relased. Raise an exception
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
426 # if the barrier is reset or broken.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
427 def _wait(self, timeout):
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
428 if not self._cond.wait_for(lambda : self._state != 0, timeout):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
429 #timed out. Break the barrier
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
430 self._break()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
431 raise BrokenBarrierError
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
432 if self._state < 0:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
433 raise BrokenBarrierError
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
434 assert self._state == 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
435
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
436 # If we are the last thread to exit the barrier, signal any threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
437 # waiting for the barrier to drain.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
438 def _exit(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
439 if self._count == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
440 if self._state in (-1, 1):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
441 #resetting or draining
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
442 self._state = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
443 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
444
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
445 def reset(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
446 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
447 Reset the barrier to the initial state.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
448 Any threads currently waiting will get the BrokenBarrier exception
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
449 raised.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
450 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
451 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
452 if self._count > 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
453 if self._state == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
454 #reset the barrier, waking up threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
455 self._state = -1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
456 elif self._state == -2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
457 #was broken, set it to reset state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
458 #which clears when the last thread exits
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
459 self._state = -1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
460 else:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
461 self._state = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
462 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
463
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
464 def abort(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
465 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
466 Place the barrier into a 'broken' state.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
467 Useful in case of error. Any currently waiting threads and
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
468 threads attempting to 'wait()' will have BrokenBarrierError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
469 raised.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
470 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
471 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
472 self._break()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
473
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
474 def _break(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
475 # An internal error was detected. The barrier is set to
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
476 # a broken state all parties awakened.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
477 self._state = -2
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
478 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
479
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
480 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
481 def parties(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
482 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
483 Return the number of threads required to trip the barrier.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
484 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
485 return self._parties
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
486
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
487 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
488 def n_waiting(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
489 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
490 Return the number of threads that are currently waiting at the barrier.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
491 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
492 # We don't need synchronization here since this is an ephemeral result
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
493 # anyway. It returns the correct value in the steady state.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
494 if self._state == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
495 return self._count
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
496 return 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
497
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
498 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
499 def broken(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
500 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
501 Return True if the barrier is in a broken state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
502 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
503 return self._state == -2
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
504
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
505 #exception raised by the Barrier class
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
506 class BrokenBarrierError(RuntimeError): pass
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
507
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
508
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 # Helper to generate new thread names
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 _counter = 0
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 def _newname(template="Thread-%d"):
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 global _counter
82591
28b86525ef07 Update code to increment and decrement using the cleaner += 1 and -= 1 style.
Raymond Hettinger <python@rcn.com>
parents: 76597
diff changeset
513 _counter += 1
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 return template % _counter
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
515
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 # Active thread administration
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 _active_limbo_lock = _allocate_lock()
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
518 _active = {} # maps thread id to Thread object
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 _limbo = {}
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
520 _dangling = WeakSet()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
521
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 # Main class for threads
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
523
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
524 class Thread:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
525
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22830
diff changeset
526 __initialized = False
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
527 # Need to store a reference to sys.exc_info for printing
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
528 # out exceptions when a thread tries to use a global var. during interp.
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
529 # shutdown and thus raises an exception about trying to perform some
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
530 # operation on/with a NoneType
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
531 __exc_info = _sys.exc_info
46161
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
532 # Keep sys.exc_clear too to clear the exception just before
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
533 # allowing .join() to return.
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
534 #XXX __exc_clear = _sys.exc_clear
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
535
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 def __init__(self, group=None, target=None, name=None,
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
537 args=(), kwargs=None, *, daemon=None):
8474
049aa3a8a172 Get rid of tabnanny's last complaints.
Guido van Rossum <guido@python.org>
parents: 8454
diff changeset
538 assert group is None, "group argument must be None for now"
35236
d0c6965b525e bug [ 1238170 ] threading.Thread uses {} as default argument
Georg Brandl <georg@python.org>
parents: 34512
diff changeset
539 if kwargs is None:
d0c6965b525e bug [ 1238170 ] threading.Thread uses {} as default argument
Georg Brandl <georg@python.org>
parents: 34512
diff changeset
540 kwargs = {}
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
541 self._target = target
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
542 self._name = str(name or _newname())
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
543 self._args = args
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
544 self._kwargs = kwargs
68155
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
545 if daemon is not None:
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
546 self._daemonic = daemon
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
547 else:
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
548 self._daemonic = current_thread().daemon
47555
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
549 self._ident = None
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
550 self._tstate_lock = None
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
551 self._started = Event()
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
552 self._is_stopped = False
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
553 self._initialized = True
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
554 # sys.stderr is not stored in the class like
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
555 # sys.exc_info since it can be changed between instances
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
556 self._stderr = _sys.stderr
85623
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
557 # For debugging and _after_fork()
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
558 _dangling.add(self)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
559
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
560 def _reset_internal_locks(self, is_alive):
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
561 # private! Called by _after_fork() to reset our internal locks as
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
562 # they may be in an invalid state leading to a deadlock or crash.
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
563 self._started._reset_internal_locks()
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
564 if is_alive:
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
565 self._set_tstate_lock()
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
566 else:
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
567 # The thread isn't alive after fork: it doesn't have a tstate
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
568 # anymore.
85649
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
569 self._is_stopped = True
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
570 self._tstate_lock = None
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
571
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 def __repr__(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
573 assert self._initialized, "Thread.__init__() was not called"
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 status = "initial"
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
575 if self._started.is_set():
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
576 status = "started"
85650
967af1815967 Get "stopped" back into repr(Thread) when appropriate.
Tim Peters <tim@python.org>
parents: 85649
diff changeset
577 self.is_alive() # easy way to get ._is_stopped set when appropriate
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
578 if self._is_stopped:
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 status = "stopped"
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
580 if self._daemonic:
47555
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
581 status += " daemon"
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
582 if self._ident is not None:
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
583 status += " %s" % self._ident
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
584 return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
585
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 def start(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
587 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
588 raise RuntimeError("thread.__init__() not called")
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
589
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
590 if self._started.is_set():
60379
c10024abd118 Merged revisions 79819 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents: 59203
diff changeset
591 raise RuntimeError("threads can only be started once")
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
592 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
593 _limbo[self] = self
59203
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
594 try:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
595 _start_new_thread(self._bootstrap, ())
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
596 except Exception:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
597 with _active_limbo_lock:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
598 del _limbo[self]
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
599 raise
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
600 self._started.wait()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
601
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 def run(self):
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
603 try:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
604 if self._target:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
605 self._target(*self._args, **self._kwargs)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
606 finally:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
607 # Avoid a refcycle if the thread is running a function with
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
608 # an argument that has a member that points to the thread.
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
609 del self._target, self._args, self._kwargs
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
610
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
611 def _bootstrap(self):
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
612 # Wrapper around the real bootstrap code that ignores
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
613 # exceptions during interpreter cleanup. Those typically
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
614 # happen when a daemon thread wakes up at an unfortunate
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
615 # moment, finds the world around it destroyed, and raises some
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
616 # random exception *** while trying to report the exception in
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
617 # _bootstrap_inner() below ***. Those random exceptions
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
618 # don't help anybody, and they confuse users, so we suppress
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
619 # them. We suppress them only when it appears that the world
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
620 # indeed has already been destroyed, so that exceptions in
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
621 # _bootstrap_inner() during normal business hours are properly
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
622 # reported. Also, we only suppress them for daemonic threads;
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
623 # if a non-daemonic encounters this, something else is wrong.
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
624 try:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
625 self._bootstrap_inner()
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
626 except:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
627 if self._daemonic and _sys is None:
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
628 return
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
629 raise
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
630
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
631 def _set_ident(self):
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
632 self._ident = get_ident()
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
633
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
634 def _set_tstate_lock(self):
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
635 """
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
636 Set a lock object which will be released by the interpreter when
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
637 the underlying thread state (see pystate.h) gets deleted.
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
638 """
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
639 self._tstate_lock = _set_sentinel()
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
640 self._tstate_lock.acquire()
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
641
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
642 def _bootstrap_inner(self):
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 try:
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
644 self._set_ident()
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
645 self._set_tstate_lock()
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
646 self._started.set()
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
647 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
648 _active[self._ident] = self
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
649 del _limbo[self]
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
650
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
651 if _trace_hook:
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
652 _sys.settrace(_trace_hook)
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
653 if _profile_hook:
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
654 _sys.setprofile(_profile_hook)
29686
371092ce5c2b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 29683
diff changeset
655
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 self.run()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 except SystemExit:
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
659 pass
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 except:
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
661 # If sys.stderr is no more (most likely from interpreter
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
662 # shutdown) use self._stderr. Otherwise still use sys (as in
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
663 # _sys) in case sys.stderr was redefined since the creation of
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
664 # self.
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
665 if _sys:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
666 _sys.stderr.write("Exception in thread %s:\n%s\n" %
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
667 (self.name, _format_exc()))
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
668 else:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
669 # Do the best job possible w/o a huge amt. of code to
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
670 # approximate a traceback (code ideas from
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
671 # Lib/traceback.py)
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
672 exc_type, exc_value, exc_tb = self._exc_info()
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
673 try:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
674 print((
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
675 "Exception in thread " + self.name +
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
676 " (most likely raised during interpreter shutdown):"), file=self._stderr)
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
677 print((
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
678 "Traceback (most recent call last):"), file=self._stderr)
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
679 while exc_tb:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
680 print((
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
681 ' File "%s", line %s, in %s' %
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
682 (exc_tb.tb_frame.f_code.co_filename,
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
683 exc_tb.tb_lineno,
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
684 exc_tb.tb_frame.f_code.co_name)), file=self._stderr)
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
685 exc_tb = exc_tb.tb_next
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
686 print(("%s: %s" % (exc_type, exc_value)), file=self._stderr)
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
687 # Make sure that exc_tb gets deleted since it is a memory
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
688 # hog; deleting everything else is just for thoroughness
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
689 finally:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
690 del exc_type, exc_value, exc_tb
46161
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
691 finally:
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
692 # Prevent a race in
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
693 # test_threading.test_no_refcycle_through_target when
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
694 # the exception keeps the target alive past when we
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
695 # assert that it's dead.
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
696 #XXX self.__exc_clear()
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
697 pass
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 finally:
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
699 with _active_limbo_lock:
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
700 try:
47555
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
701 # We don't call self._delete() because it also
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
702 # grabs _active_limbo_lock.
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
703 del _active[get_ident()]
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
704 except:
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
705 pass
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
706
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
707 def _stop(self):
85649
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
708 # After calling ._stop(), .is_alive() returns False and .join() returns
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
709 # immediately. ._tstate_lock must be released before calling ._stop().
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
710 #
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
711 # Normal case: C code at the end of the thread's life
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
712 # (release_sentinel in _threadmodule.c) releases ._tstate_lock, and
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
713 # that's detected by our ._wait_for_tstate_lock(), called by .join()
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
714 # and .is_alive(). Any number of threads _may_ call ._stop()
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
715 # simultaneously (for example, if multiple threads are blocked in
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
716 # .join() calls), and they're not serialized. That's harmless -
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
717 # they'll just make redundant rebindings of ._is_stopped and
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
718 # ._tstate_lock. Obscure: we rebind ._tstate_lock last so that the
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
719 # "assert self._is_stopped" in ._wait_for_tstate_lock() always works
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
720 # (the assert is executed only if ._tstate_lock is None).
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
721 #
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
722 # Special case: _main_thread releases ._tstate_lock via this
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
723 # module's _shutdown() function.
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
724 lock = self._tstate_lock
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
725 if lock is not None:
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
726 assert not lock.locked()
85648
e61780cd2c78 Backed out changeset 1f5a7853680c
Tim Peters <tim@python.org>
parents: 85647
diff changeset
727 self._is_stopped = True
e61780cd2c78 Backed out changeset 1f5a7853680c
Tim Peters <tim@python.org>
parents: 85647
diff changeset
728 self._tstate_lock = None
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
729
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
730 def _delete(self):
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
731 "Remove current thread from the dict of currently running threads."
32774
8a91cd7d7e82 Fix bug where a KeyError was raised if -O was being used for the interpreter
Brett Cannon <bcannon@gmail.com>
parents: 32673
diff changeset
732
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
733 # Notes about running with _dummy_thread:
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
734 #
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
735 # Must take care to not raise an exception if _dummy_thread is being
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
736 # used (and thus this module is being used as an instance of
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
737 # dummy_threading). _dummy_thread.get_ident() always returns -1 since
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
738 # there is only one thread if _dummy_thread is being used. Thus
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
739 # len(_active) is always <= 1 here, and any Thread instance created
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
740 # overwrites the (if any) thread currently registered in _active.
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
741 #
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
742 # An instance of _MainThread is always created by 'threading'. This
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
743 # gets overwritten the instant an instance of Thread is created; both
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
744 # threads return -1 from _dummy_thread.get_ident() and thus have the
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
745 # same key in the dict. So when the _MainThread instance created by
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
746 # 'threading' tries to clean itself up when atexit calls this method
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
747 # it gets a KeyError if another Thread instance was created.
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
748 #
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
749 # This all means that KeyError from trying to delete something from
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
750 # _active if dummy_threading is being used is a red herring. But
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
751 # since it isn't if dummy_threading is *not* being used then don't
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
752 # hide the exception.
32774
8a91cd7d7e82 Fix bug where a KeyError was raised if -O was being used for the interpreter
Brett Cannon <bcannon@gmail.com>
parents: 32673
diff changeset
753
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
754 try:
46304
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
755 with _active_limbo_lock:
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
756 del _active[get_ident()]
46304
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
757 # There must not be any python code between the previous line
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
758 # and after the lock is released. Otherwise a tracing function
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
759 # could try to acquire the lock again in the same thread, (in
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
760 # current_thread()), and would block.
46304
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
761 except KeyError:
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
762 if 'dummy_threading' not in _sys.modules:
3442e9e6b2cf Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46161
diff changeset
763 raise
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
764
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 def join(self, timeout=None):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
766 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
767 raise RuntimeError("Thread.__init__() not called")
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
768 if not self._started.is_set():
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
769 raise RuntimeError("cannot join thread before it is started")
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
770 if self is current_thread():
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
771 raise RuntimeError("cannot join current thread")
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
772 if timeout is None:
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
773 self._wait_for_tstate_lock()
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
774 else:
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
775 self._wait_for_tstate_lock(timeout=timeout)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
776
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
777 def _wait_for_tstate_lock(self, block=True, timeout=-1):
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
778 # Issue #18808: wait for the thread state to be gone.
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
779 # At the end of the thread's life, after all knowledge of the thread
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
780 # is removed from C data structures, C code releases our _tstate_lock.
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
781 # This method passes its arguments to _tstate_lock.aquire().
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
782 # If the lock is acquired, the C code is done, and self._stop() is
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
783 # called. That sets ._is_stopped to True, and ._tstate_lock to None.
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
784 lock = self._tstate_lock
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
785 if lock is None: # already determined that the C code is done
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
786 assert self._is_stopped
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
787 elif lock.acquire(block, timeout):
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
788 lock.release()
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
789 self._stop()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
790
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
791 @property
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
792 def name(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
793 assert self._initialized, "Thread.__init__() not called"
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
794 return self._name
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
795
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
796 @name.setter
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
797 def name(self, name):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
798 assert self._initialized, "Thread.__init__() not called"
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
799 self._name = str(name)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
800
48743
76620010d782 Merged revisions 65818 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48516
diff changeset
801 @property
76620010d782 Merged revisions 65818 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48516
diff changeset
802 def ident(self):
47555
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
803 assert self._initialized, "Thread.__init__() not called"
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
804 return self._ident
7d824fd131ad Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47266
diff changeset
805
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
806 def is_alive(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
807 assert self._initialized, "Thread.__init__() not called"
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
808 if self._is_stopped or not self._started.is_set():
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
809 return False
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
810 self._wait_for_tstate_lock(False)
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
811 return not self._is_stopped
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
812
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
813 isAlive = is_alive
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
814
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
815 @property
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
816 def daemon(self):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
817 assert self._initialized, "Thread.__init__() not called"
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
818 return self._daemonic
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
819
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
820 @daemon.setter
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
821 def daemon(self, daemonic):
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
822 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
823 raise RuntimeError("Thread.__init__() not called")
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
824 if self._started.is_set():
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
825 raise RuntimeError("cannot set daemon status of active thread");
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
826 self._daemonic = daemonic
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
827
48748
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
828 def isDaemon(self):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
829 return self.daemon
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
830
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
831 def setDaemon(self, daemonic):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
832 self.daemon = daemonic
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
833
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
834 def getName(self):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
835 return self.name
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
836
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
837 def setName(self, name):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
838 self.name = name
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
839
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
840 # The timer class was contributed by Itamar Shtull-Trauring
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
841
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
842 class Timer(Thread):
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
843 """Call a function after a specified number of seconds:
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
844
83029
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
845 t = Timer(30.0, f, args=None, kwargs=None)
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
846 t.start()
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
847 t.cancel() # stop the timer's action if it's still waiting
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
848 """
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
849
83029
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
850 def __init__(self, interval, function, args=None, kwargs=None):
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
851 Thread.__init__(self)
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
852 self.interval = interval
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
853 self.function = function
83029
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
854 self.args = args if args is not None else []
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
855 self.kwargs = kwargs if kwargs is not None else {}
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
856 self.finished = Event()
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
857
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
858 def cancel(self):
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
859 """Stop the timer if it hasn't finished yet"""
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
860 self.finished.set()
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
861
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
862 def run(self):
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
863 self.finished.wait(self.interval)
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
864 if not self.finished.is_set():
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
865 self.function(*self.args, **self.kwargs)
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
866 self.finished.set()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
867
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 # Special thread class to represent the main thread
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 # This is garbage collected through an exit handler
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
870
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 class _MainThread(Thread):
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
872
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 def __init__(self):
68155
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
874 Thread.__init__(self, name="MainThread", daemon=False)
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
875 self._set_tstate_lock()
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
876 self._started.set()
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
877 self._set_ident()
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
878 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
879 _active[self._ident] = self
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
880
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
881
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 # Dummy thread class to represent threads not started here.
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
883 # These aren't garbage collected when they die, nor can they be waited for.
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
884 # If they invoke anything in threading.py that calls current_thread(), they
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
885 # leave an entry in the _active dict forever after.
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
886 # Their purpose is to return *something* from current_thread().
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 # They are marked as daemon threads so we won't wait for them
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 # when we exit (conform previous semantics).
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
889
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
890 class _DummyThread(Thread):
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
891
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 def __init__(self):
68155
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
893 Thread.__init__(self, name=_newname("Dummy-%d"), daemon=True)
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
894
45549
8dd30fe11a4b Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45495
diff changeset
895 self._started.set()
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
896 self._set_ident()
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
897 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
898 _active[self._ident] = self
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
899
76421
41c64c700e1e Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork().
Antoine Pitrou <solipsis@pitrou.net>
parents: 74749
diff changeset
900 def _stop(self):
41c64c700e1e Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork().
Antoine Pitrou <solipsis@pitrou.net>
parents: 74749
diff changeset
901 pass
41c64c700e1e Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork().
Antoine Pitrou <solipsis@pitrou.net>
parents: 74749
diff changeset
902
21981
4e9cc26e03fd SF #515023. Make _DummyThread.join() signature match base class (Thread)
Neal Norwitz <nnorwitz@gmail.com>
parents: 21589
diff changeset
903 def join(self, timeout=None):
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22830
diff changeset
904 assert False, "cannot join a dummy thread"
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
905
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
906
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 # Global API functions
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
908
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
909 def current_thread():
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 try:
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
911 return _active[get_ident()]
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 except KeyError:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 return _DummyThread()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
914
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
915 currentThread = current_thread
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
916
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
917 def active_count():
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
918 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
919 return len(_active) + len(_limbo)
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
920
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
921 activeCount = active_count
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
922
57121
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
923 def _enumerate():
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
924 # Same as enumerate(), but without the lock. Internal use only.
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
925 return list(_active.values()) + list(_limbo.values())
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
926
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
927 def enumerate():
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
928 with _active_limbo_lock:
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49058
diff changeset
929 return list(_active.values()) + list(_limbo.values())
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
930
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
931 from _thread import stack_size
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
932
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
933 # Create the main thread object,
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
934 # and make it available for the interpreter
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
935 # (Py_Main) as threading._shutdown.
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
936
85520
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
937 _main_thread = _MainThread()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
938
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
939 def _shutdown():
85631
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
940 # Obscure: other threads may be waiting to join _main_thread. That's
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
941 # dubious, but some code does it. We can't wait for C code to release
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
942 # the main thread's tstate_lock - that won't happen until the interpreter
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
943 # is nearly dead. So we release it here. Note that just calling _stop()
aff959a3ba13 Issue 18984: Remove ._stopped Event from Thread internals.
Tim Peters <tim@python.org>
parents: 85623
diff changeset
944 # isn't enough: other threads may already be waiting on _tstate_lock.
85649
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
945 tlock = _main_thread._tstate_lock
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
946 # The main thread isn't finished yet, so its thread state lock can't have
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
947 # been released.
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
948 assert tlock is not None
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
949 assert tlock.locked()
eac63e7ceb03 Another stab at the thread cleanup patch.
Tim Peters <tim@python.org>
parents: 85648
diff changeset
950 tlock.release()
85520
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
951 _main_thread._stop()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
952 t = _pickSomeNonDaemonThread()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
953 while t:
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
954 t.join()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
955 t = _pickSomeNonDaemonThread()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
956 _main_thread._delete()
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
957
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
958 def _pickSomeNonDaemonThread():
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
959 for t in enumerate():
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
960 if not t.daemon and t.is_alive():
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
961 return t
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
962 return None
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
963
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
964 def main_thread():
85521
f18fb7f39c24 Add docstring for threading.main_thread().
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85520
diff changeset
965 """Return the main thread object.
f18fb7f39c24 Add docstring for threading.main_thread().
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85520
diff changeset
966
f18fb7f39c24 Add docstring for threading.main_thread().
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85520
diff changeset
967 In normal conditions, the main thread is the thread from which the
f18fb7f39c24 Add docstring for threading.main_thread().
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85520
diff changeset
968 Python interpreter was started.
f18fb7f39c24 Add docstring for threading.main_thread().
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85520
diff changeset
969 """
85520
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
970 return _main_thread
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
971
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
972 # get thread-local implementation, either from the thread
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
973 # module, or from the python fallback
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
974
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
975 try:
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
976 from _thread import _local as local
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
977 except ImportError:
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
978 from _threading_local import local
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
979
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
980
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
981 def _after_fork():
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
982 # This function is called by Python/ceval.c:PyEval_ReInitThreads which
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
983 # is called from PyOS_AfterFork. Here we cleanup threading module state
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
984 # that should not exist after a fork.
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
985
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
986 # Reset _active_limbo_lock, in case we forked while the lock was held
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
987 # by another (non-forked) thread. http://bugs.python.org/issue874900
85520
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
988 global _active_limbo_lock, _main_thread
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
989 _active_limbo_lock = _allocate_lock()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
990
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
991 # fork() only copied the current thread; clear references to others.
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
992 new_active = {}
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
993 current = current_thread()
85520
96e55a1a0de7 Issue #18882: Add threading.main_thread() function.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 85464
diff changeset
994 _main_thread = current
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
995 with _active_limbo_lock:
85623
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
996 # Dangling thread instances must still have their locks reset,
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
997 # because someone may join() them.
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
998 threads = set(_enumerate())
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
999 threads.update(_dangling)
74dc664ad699 Issue #18808 again: fix the after-fork logic for not-yet-started or already-stopped threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85604
diff changeset
1000 for thread in threads:
74037
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
1001 # Any lock/condition variable may be currently locked or in an
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
1002 # invalid state, so we reinitialize them.
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1003 if thread is current:
49058
179f8d89ad19 Issue #874900: fix behaviour of threading module after a fork.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48941
diff changeset
1004 # There is only one active thread. We reset the ident to
179f8d89ad19 Issue #874900: fix behaviour of threading module after a fork.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48941
diff changeset
1005 # its new value since it can have changed.
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
1006 thread._reset_internal_locks(True)
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
1007 ident = get_ident()
49058
179f8d89ad19 Issue #874900: fix behaviour of threading module after a fork.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48941
diff changeset
1008 thread._ident = ident
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1009 new_active[ident] = thread
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1010 else:
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1011 # All the others are already stopped.
85598
d52b68edbca6 Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85521
diff changeset
1012 thread._reset_internal_locks(False)
74037
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
1013 thread._stop()
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1014
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1015 _limbo.clear()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1016 _active.clear()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1017 _active.update(new_active)
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
1018 assert len(_active) == 1