annotate Lib/threading.py @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents af30c5cb248f
children e07f104133d5 a26df2d03989
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
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
14 # 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
15 # 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
16 # the convention of camelCase function and method names from that
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
17 # language. Those originaly names are not in any imminent danger of
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
18 # 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
19 # 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
20 # 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
21 # 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
22 # 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
23
67533
2244ac6c2a9b Add entry for Barrier objects.
Raymond Hettinger <python@rcn.com>
parents: 67354
diff changeset
24 __all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
2244ac6c2a9b Add entry for Barrier objects.
Raymond Hettinger <python@rcn.com>
parents: 67354
diff changeset
25 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
71701
bbeda42ea6a8 add ThreadError to threading.__all__ (closes #12679)
Benjamin Peterson <benjamin@python.org>
parents: 71560
diff changeset
26 '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
27
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # 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
29 _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
30 _allocate_lock = _thread.allocate_lock
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
31 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
32 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
33 try:
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
34 _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
35 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
36 _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
37 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
38 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
39
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
41 # 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
42
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
43 _profile_hook = None
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
44 _trace_hook = None
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
45
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
46 def setprofile(func):
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
47 global _profile_hook
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
48 _profile_hook = func
29686
371092ce5c2b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 29683
diff changeset
49
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
50 def settrace(func):
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
51 global _trace_hook
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
52 _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
53
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 # 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
55
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 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
57
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
58 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
59 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
60 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
61 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
62
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
63 class _RLock:
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
64
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
65 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
66 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
67 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
68 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
69
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 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
71 owner = self._owner
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
72 try:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
73 owner = _active[owner].name
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
74 except KeyError:
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
75 pass
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
76 return "<%s owner=%r count=%d>" % (
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
77 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
78
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
79 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
80 me = get_ident()
57160
fe33562d1f95 Merged revisions 76138,76173 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57121
diff changeset
81 if self._owner == me:
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
82 self._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
83 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
84 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
85 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
86 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
87 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
88 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
89
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
90 __enter__ = acquire
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
91
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 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
93 if self._owner != get_ident():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
94 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
95 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
96 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
97 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
98 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
99
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
100 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
101 self.release()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
102
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 # 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
104
41717
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40809
diff changeset
105 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
106 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
107 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
108
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 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
110 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
111 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
112 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
113 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
114 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
115 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
116 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
117 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
118
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 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
120 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
121
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 57160
diff changeset
122 _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
123
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
125 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
126
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
127 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
128 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
129 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
130 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
131 # 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
132 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
133 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
134 # 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
135 # 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
136 # 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
137 try:
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._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
139 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
140 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 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
143 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
144 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 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
147 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
148 pass
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
149 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
150
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
151 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
152 return self._lock.__enter__()
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
153
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
154 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
155 return self._lock.__exit__(*args)
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
156
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 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
158 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
159
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 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
161 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
162
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 _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
164 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
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 _is_owned(self):
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
167 # 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
168 # 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
169 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
170 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
171 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
172 else:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 21981
diff changeset
173 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
174
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 def wait(self, timeout=None):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
176 if not self._is_owned():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
177 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
178 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
179 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
180 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
181 saved_state = self._release_save()
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
182 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
183 if timeout is None:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
184 waiter.acquire()
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 63166
diff changeset
185 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
186 else:
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
187 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
188 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
189 else:
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 60377
diff changeset
190 gotit = waiter.acquire(False)
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
191 if not gotit:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
192 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
193 self._waiters.remove(waiter)
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
194 except ValueError:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
195 pass
65675
6dff581d30f3 #10218: return timeout status from Condition.wait, mirroring other primitives' behavior.
Georg Brandl <georg@python.org>
parents: 63166
diff changeset
196 return gotit
17303
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
197 finally:
836cdf8d1245 SF bug [#410708] Condition.wait() and KeyboardInterrupt.
Tim Peters <tim.peters@gmail.com>
parents: 15873
diff changeset
198 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
199
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
200 def wait_for(self, predicate, timeout=None):
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
201 endtime = None
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
202 waittime = timeout
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
203 result = predicate()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
204 while not result:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
205 if waittime is not None:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
206 if endtime is None:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
207 endtime = _time() + waittime
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
208 else:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
209 waittime = endtime - _time()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
210 if waittime <= 0:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
211 break
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
212 self.wait(waittime)
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
213 result = predicate()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
214 return result
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
215
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 def notify(self, n=1):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
217 if not self._is_owned():
56894
b085fd0611de Merged revisions 75797 via svnmerge from
Georg Brandl <georg@python.org>
parents: 56002
diff changeset
218 raise RuntimeError("cannot notify on 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
219 __waiters = 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
220 waiters = __waiters[:n]
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 if not waiters:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 return
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 for waiter in waiters:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 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
225 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 __waiters.remove(waiter)
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 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
228 pass
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
229
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
230 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
231 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
232
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
233 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
234
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
235
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
236 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
237
11876
c27d3e8c45c4 Fix a typo in a comment
Andrew M. Kuchling <amk@amk.ca>
parents: 11707
diff changeset
238 # 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
239
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
240 def __init__(self, value=1):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
241 if value < 0:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
242 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
243 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
244 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
245
60665
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
246 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
247 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
248 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
249 rc = False
60665
bac99229da2d Issue #850728: Add a *timeout* parameter to the `acquire()` method of
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
250 endtime = None
83497
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
251 with self._cond:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
252 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
253 if not blocking:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
254 break
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
255 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
256 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
257 endtime = _time() + timeout
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
258 else:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
259 timeout = endtime - _time()
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
260 if timeout <= 0:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
261 break
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
262 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
263 else:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
264 self._value = self._value - 1
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
265 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
266 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
267
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
268 __enter__ = acquire
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
269
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 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
271 with self._cond:
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
272 self._value = self._value + 1
af30c5cb248f Issue #11714: Use 'with' statements to assure a Semaphore releases a
Serhiy Storchaka <storchaka@gmail.com>
parents: 83029
diff changeset
273 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
274
36737
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
275 def __exit__(self, t, v, tb):
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
276 self.release()
fa92fe15251a Updates to the with-statement:
Guido van Rossum <guido@python.org>
parents: 35932
diff changeset
277
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
278
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
279 class BoundedSemaphore(Semaphore):
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
280 """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
281 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
282 Semaphore.__init__(self, value)
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
283 self._initial_value = value
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
284
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
285 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
286 if self._value >= self._initial_value:
43020
907a45df1295 Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents: 42679
diff changeset
287 raise ValueError("Semaphore released too many times")
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
288 return Semaphore.release(self)
19404
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
289
6125d9f92441 Added new BoundedSemaphore class. Closes bug 452836.
Skip Montanaro <skip@pobox.com>
parents: 19379
diff changeset
290
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
291 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
292
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 # 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
294
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
295 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
296 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
297 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
298
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
299 def _reset_internal_locks(self):
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
300 # 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
301 self._cond.__init__()
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
302
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
303 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
304 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
305
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
306 isSet = is_set
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
307
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 def set(self):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
309 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
310 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
311 self._flag = True
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
312 self._cond.notify_all()
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
313 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
314 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
315
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 def clear(self):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
317 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
318 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
319 self._flag = False
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
320 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
321 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
322
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 def wait(self, timeout=None):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
324 self._cond.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
325 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
326 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
327 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
328 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
329 return signaled
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
330 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
331 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
332
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
333
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
334 # 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
335 # the CyclicBarrier class from Java. See
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
336 # 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
337 # 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
338 # CyclicBarrier.html
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
339 # for information.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
340 # 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
341 # 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
342 # 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
343 # similar to 'draining' except that threads leave with a BrokenBarrierError,
72985
e19ccbbe70dd Remove duplication.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 71361
diff changeset
344 # 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
345 class Barrier:
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
346 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
347 Barrier. Useful for synchronizing a fixed number of threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
348 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
349 simultaneously once they have all made that call.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
350 """
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
351 def __init__(self, parties, action=None, timeout=None):
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 Create a barrier, initialised to 'parties' threads.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
354 '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
355 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
356 barrier and just prior to releasing them all.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
357 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
358 all subsequent 'wait()' calls.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
359 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
360 self._cond = Condition(Lock())
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
361 self._action = action
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
362 self._timeout = timeout
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
363 self._parties = parties
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
364 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
365 self._count = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
366
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
367 def wait(self, timeout=None):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
368 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
369 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
370 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
371 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
372 that callback prior to returning.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
373 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
374 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
375 if timeout is None:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
376 timeout = self._timeout
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
377 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
378 self._enter() # Block while the barrier drains.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
379 index = self._count
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
380 self._count += 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
381 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
382 if index + 1 == self._parties:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
383 # We release the barrier
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
384 self._release()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
385 else:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
386 # We wait until someone releases us
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
387 self._wait(timeout)
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
388 return index
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
389 finally:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
390 self._count -= 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
391 # Wake up any threads waiting for barrier to drain.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
392 self._exit()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
393
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
394 # 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
395 # if it is broken.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
396 def _enter(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
397 while self._state in (-1, 1):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
398 # It is draining or resetting, wait until done
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
399 self._cond.wait()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
400 #see if the barrier is in a broken state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
401 if self._state < 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
402 raise BrokenBarrierError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
403 assert self._state == 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
404
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
405 # Optionally run the 'action' and release the threads waiting
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
406 # in the barrier.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
407 def _release(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
408 try:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
409 if self._action:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
410 self._action()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
411 # enter draining state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
412 self._state = 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
413 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
414 except:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
415 #an exception during the _action handler. Break and reraise
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
416 self._break()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
417 raise
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
418
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
419 # 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
420 # if the barrier is reset or broken.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
421 def _wait(self, timeout):
66229
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
422 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
423 #timed out. Break the barrier
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
424 self._break()
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
425 raise BrokenBarrierError
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
426 if self._state < 0:
483bbebc57bf Issue 10260
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65677
diff changeset
427 raise BrokenBarrierError
65677
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
428 assert self._state == 1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
429
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
430 # 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
431 # waiting for the barrier to drain.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
432 def _exit(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
433 if self._count == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
434 if self._state in (-1, 1):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
435 #resetting or draining
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
436 self._state = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
437 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
438
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
439 def reset(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
440 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
441 Reset the barrier to the initial state.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
442 Any threads currently waiting will get the BrokenBarrier exception
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
443 raised.
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 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
446 if self._count > 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
447 if self._state == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
448 #reset the barrier, waking up threads
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
449 self._state = -1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
450 elif self._state == -2:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
451 #was broken, set it to reset state
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
452 #which clears when the last thread exits
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
453 self._state = -1
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
454 else:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
455 self._state = 0
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
456 self._cond.notify_all()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
457
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
458 def abort(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
459 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
460 Place the barrier into a 'broken' state.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
461 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
462 threads attempting to 'wait()' will have BrokenBarrierError
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
463 raised.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
464 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
465 with self._cond:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
466 self._break()
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
467
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
468 def _break(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
469 # 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
470 # a broken state all parties awakened.
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
471 self._state = -2
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
472 self._cond.notify_all()
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 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
475 def parties(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
476 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
477 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
478 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
479 return self._parties
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
480
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
481 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
482 def n_waiting(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
483 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
484 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
485 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
486 # 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
487 # 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
488 if self._state == 0:
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
489 return self._count
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
490 return 0
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 @property
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
493 def broken(self):
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
494 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
495 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
496 """
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
497 return self._state == -2
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
498
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
499 #exception raised by the Barrier class
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
500 class BrokenBarrierError(RuntimeError): pass
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
501
5a882f789ec1 issue 8777
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 65675
diff changeset
502
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 # 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
504 _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
505 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
506 global _counter
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 _counter = _counter + 1
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 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
509
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 # 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
511 _active_limbo_lock = _allocate_lock()
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
512 _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
513 _limbo = {}
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
514
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
515 # For debug and leak testing
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
516 _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
517
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 # 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
519
75373
8ec51b2e57c2 Close #13550: Remove the debug machinery from the threading module: remove
Victor Stinner <victor.stinner@gmail.com>
parents: 74750
diff changeset
520 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
521
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22830
diff changeset
522 __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
523 # 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
524 # 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
525 # 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
526 # 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
527 __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
528 # 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
529 # 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
530 #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
531
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 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
533 args=(), kwargs=None, *, daemon=None):
8474
049aa3a8a172 Get rid of tabnanny's last complaints.
Guido van Rossum <guido@python.org>
parents: 8454
diff changeset
534 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
535 if kwargs is None:
d0c6965b525e bug [ 1238170 ] threading.Thread uses {} as default argument
Georg Brandl <georg@python.org>
parents: 34512
diff changeset
536 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
537 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
538 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
539 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
540 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
541 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
542 self._daemonic = daemon
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
543 else:
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 67629
diff changeset
544 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
545 self._ident = 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
546 self._started = Event()
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
547 self._stopped = False
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
548 self._block = 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
549 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
550 # 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
551 # 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
552 self._stderr = _sys.stderr
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
553 _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
554
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
555 def _reset_internal_locks(self):
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
556 # 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
557 # 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
558 if hasattr(self, '_block'): # DummyThread deletes _block
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
559 self._block.__init__()
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
560 self._started._reset_internal_locks()
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
561
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 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
563 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
564 status = "initial"
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
565 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
566 status = "started"
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
567 if self._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
568 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
569 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
570 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
571 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
572 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
573 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
574
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 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
576 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
577 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
578
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
579 if self._started.is_set():
60379
c10024abd118 Merged revisions 79819 via svnmerge from
Senthil Kumaran <orsenthil@gmail.com>
parents: 59203
diff changeset
580 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
581 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
582 _limbo[self] = self
59203
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
583 try:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
584 _start_new_thread(self._bootstrap, ())
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
585 except Exception:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
586 with _active_limbo_lock:
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
587 del _limbo[self]
9e8113e76adb Merged revisions 78519 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 57160
diff changeset
588 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
589 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
590
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 def run(self):
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
592 try:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
593 if self._target:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
594 self._target(*self._args, **self._kwargs)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
595 finally:
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
596 # 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
597 # 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
598 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
599
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
600 def _bootstrap(self):
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
601 # 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
602 # exceptions during interpreter cleanup. Those typically
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
603 # 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
604 # 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
605 # 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
606 # _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
607 # 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
608 # 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
609 # 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
610 # _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
611 # 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
612 # 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
613 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
614 self._bootstrap_inner()
42678
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
615 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
616 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
617 return
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
618 raise
af6a7190cabc Merged revisions 57152-57220 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42466
diff changeset
619
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
620 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
621 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
622
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
623 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
624 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
625 self._set_ident()
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
626 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
627 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
628 _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
629 del _limbo[self]
29679
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
630
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
631 if _trace_hook:
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
632 _sys.settrace(_trace_hook)
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
633 if _profile_hook:
d0f15977f37f Add settrace() and setprofile() functions to the threading library.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 29676
diff changeset
634 _sys.setprofile(_profile_hook)
29686
371092ce5c2b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 29683
diff changeset
635
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 try:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 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
638 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
639 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
640 except:
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
641 # 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
642 # 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
643 # _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
644 # self.
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
645 if _sys:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
646 _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
647 (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
648 else:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
649 # 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
650 # 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
651 # 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
652 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
653 try:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
654 print((
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
655 "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
656 " (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
657 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
658 "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
659 while exc_tb:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40582
diff changeset
660 print((
32475
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
661 ' 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
662 (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
663 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
664 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
665 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
666 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
667 # 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
668 # 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
669 finally:
796ccb9082ef threading.Thread objects will now print a traceback for an exception raised
Brett Cannon <bcannon@gmail.com>
parents: 31629
diff changeset
670 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
671 finally:
848160d10780 Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45549
diff changeset
672 # 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
673 # 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
674 # 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
675 # 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
676 #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
677 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
678 finally:
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
679 with _active_limbo_lock:
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
680 self._stop()
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
681 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
682 # 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
683 # 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
684 del _active[get_ident()]
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
685 except:
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 43020
diff changeset
686 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
687
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
688 def _stop(self):
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
689 self._block.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
690 self._stopped = True
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
691 self._block.notify_all()
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
692 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
693
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
694 def _delete(self):
32778
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
695 "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
696
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
697 # 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
698 #
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
699 # 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
700 # 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
701 # 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
702 # 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
703 # 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
704 # 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
705 #
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
706 # 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
707 # 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
708 # 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
709 # 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
710 # '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
711 # 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
712 #
7af695bc5480 Thread.__delete: Discussion of internal obscurities belongs in comments
Tim Peters <tim.peters@gmail.com>
parents: 32774
diff changeset
713 # 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
714 # _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
715 # 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
716 # 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
717
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
718 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
719 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
720 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
721 # 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
722 # 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
723 # 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
724 # 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
725 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
726 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
727 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
728
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 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
730 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
731 raise RuntimeError("Thread.__init__() not called")
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
732 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
733 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
734 if self is current_thread():
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
735 raise RuntimeError("cannot join current thread")
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
736
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
737 self._block.acquire()
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
738 try:
35932
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
739 if timeout is 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
740 while not self._stopped:
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
741 self._block.wait()
35932
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
742 else:
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
743 deadline = _time() + timeout
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
744 while not self._stopped:
35932
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
745 delay = deadline - _time()
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
746 if delay <= 0:
b7c6c461a808 Prevent threading.Thread.join() from blocking when a previous call raised an
Brett Cannon <bcannon@gmail.com>
parents: 35236
diff changeset
747 break
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
748 self._block.wait(delay)
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
749 finally:
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
750 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
751
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
752 @property
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
753 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
754 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
755 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
756
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
757 @name.setter
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
758 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
759 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
760 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
761
48743
76620010d782 Merged revisions 65818 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48516
diff changeset
762 @property
76620010d782 Merged revisions 65818 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48516
diff changeset
763 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
764 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
765 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
766
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
767 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
768 assert self._initialized, "Thread.__init__() not called"
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
769 return self._started.is_set() and not self._stopped
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
770
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
771 isAlive = is_alive
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
772
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
773 @property
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
774 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
775 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
776 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
777
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
778 @daemon.setter
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
779 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
780 if not self._initialized:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
781 raise RuntimeError("Thread.__init__() not called")
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
782 if self._started.is_set():
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
783 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
784 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
785
48748
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
786 def isDaemon(self):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
787 return self.daemon
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
788
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
789 def setDaemon(self, daemonic):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
790 self.daemon = daemonic
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
791
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
792 def getName(self):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
793 return self.name
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
794
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
795 def setName(self, name):
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
796 self.name = name
d6537a3e1b73 Merged revisions 65826 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48745
diff changeset
797
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
798 # 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
799
71560
7f606223578a Remove indirection in threading (issue #10968).
Éric Araujo <merwok@netwok.org>
parents: 71362
diff changeset
800 class Timer(Thread):
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
801 """Call a function after a specified number of seconds:
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
802
83029
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
803 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
804 t.start()
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
805 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
806 """
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
807
83029
2698920eadcd Issue #17435: Don't use mutable default values in Timer.
R David Murray <rdmurray@bitdance.com>
parents: 76597
diff changeset
808 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
809 Thread.__init__(self)
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
810 self.interval = interval
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
811 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
812 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
813 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
814 self.finished = Event()
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
815
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
816 def cancel(self):
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
817 """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
818 self.finished.set()
19953
0f9df563b65d Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 19727
diff changeset
819
19727
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
820 def run(self):
f3036d4e3c22 Patch #428326: New class threading.Timer.
Martin v. Löwis <martin@v.loewis.de>
parents: 19404
diff changeset
821 self.finished.wait(self.interval)
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
822 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
823 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
824 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
825
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 # 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
827 # 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
828
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 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
830
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 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
832 Thread.__init__(self, name="MainThread", daemon=False)
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
833 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
834 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
835 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
836 _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
837
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
838 def _exitfunc(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
839 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
840 t = _pickSomeNonDaemonThread()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 while t:
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 t.join()
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 t = _pickSomeNonDaemonThread()
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
844 self._delete()
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
845
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 def _pickSomeNonDaemonThread():
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 for t in enumerate():
48745
2614d501de9a change is_daemon, set_daemon, get_name, and set_name to properties
Benjamin Peterson <benjamin@python.org>
parents: 48743
diff changeset
848 if not t.daemon and t.is_alive():
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 return t
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 return None
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
851
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
852
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 # 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
854 # 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
855 # 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
856 # 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
857 # 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
858 # 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
859 # 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
860
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 class _DummyThread(Thread):
15873
3dd217fbdd59 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15586
diff changeset
862
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 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
864 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
865
67355
a3b7c290754a Merged revisions 87740 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 67340
diff changeset
866 # Thread._block consumes an OS-level locking primitive, which
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
867 # can never be used by a _DummyThread. Since a _DummyThread
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
868 # instance is immortal, that's bad, so release this resource.
42679
e71c3223810f Get rid of all __private variables and methods in the threading module.
Guido van Rossum <guido@python.org>
parents: 42678
diff changeset
869 del self._block
34363
35f31790c6f9 threading._DummyThread.__init__(): document obscure new code.
Tim Peters <tim.peters@gmail.com>
parents: 34361
diff changeset
870
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
871 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
872 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
873 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
874 _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
875
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
876 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
877 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
878
21981
4e9cc26e03fd SF #515023. Make _DummyThread.join() signature match base class (Thread)
Neal Norwitz <nnorwitz@gmail.com>
parents: 21589
diff changeset
879 def join(self, timeout=None):
22867
e2f2187c3d2c Partial introduction of bools where appropriate.
Guido van Rossum <guido@python.org>
parents: 22830
diff changeset
880 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
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
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 # 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
884
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
885 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
886 try:
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
887 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
888 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
889 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
890
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
891 currentThread = current_thread
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
892
47615
045f83a1b864 Merged revisions 64125 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47555
diff changeset
893 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
894 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
895 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
896
48941
4fc480be1e4d remove the deprecation warnings for the old threading API; update the docs
Benjamin Peterson <benjamin@python.org>
parents: 48757
diff changeset
897 activeCount = active_count
48757
54138ee20e57 add full deprecation warnings for old threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 48748
diff changeset
898
57121
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
899 def _enumerate():
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
900 # 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
901 return list(_active.values()) + list(_limbo.values())
4ea0a80ed76a Merged revisions 76119 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56894
diff changeset
902
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 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
904 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
905 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
906
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
907 from _thread import stack_size
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
908
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
909 # Create the main thread object,
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
910 # and make it available for the interpreter
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
911 # (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
912
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
913 _shutdown = _MainThread()._exitfunc
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
914
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
915 # 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
916 # 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
917
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
918 try:
47266
7fe3a8648ce2 Rename thread to _thread and dummy_thread to _dummy_thread. Issue #2875.
Georg Brandl <georg@python.org>
parents: 46304
diff changeset
919 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
920 except ImportError:
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
921 from _threading_local import local
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 32475
diff changeset
922
7949
58d6815af002 New Java-style threading module. The doc strings are in a separate module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
923
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
924 def _after_fork():
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
925 # 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
926 # 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
927 # that should not exist after a fork.
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
928
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
929 # 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
930 # by another (non-forked) thread. http://bugs.python.org/issue874900
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
931 global _active_limbo_lock
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
932 _active_limbo_lock = _allocate_lock()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
933
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
934 # fork() only copied the current thread; clear references to others.
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
935 new_active = {}
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
936 current = current_thread()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
937 with _active_limbo_lock:
49058
179f8d89ad19 Issue #874900: fix behaviour of threading module after a fork.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48941
diff changeset
938 for thread in _active.values():
74037
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
939 # 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
940 # invalid state, so we reinitialize them.
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
941 thread._reset_internal_locks()
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
942 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
943 # 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
944 # its new value since it can have changed.
70530
5548197d1f22 Close #12028: Make threading._get_ident() public, rename it to
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69710
diff changeset
945 ident = get_ident()
49058
179f8d89ad19 Issue #874900: fix behaviour of threading module after a fork.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48941
diff changeset
946 thread._ident = ident
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
947 new_active[ident] = thread
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
948 else:
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
949 # All the others are already stopped.
74037
de962ec0faaa Issue #11870: threading: Properly reinitialize threads internal locks and
Charles-François Natali <neologix@free.fr>
parents: 72985
diff changeset
950 thread._stop()
48516
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
951
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
952 _limbo.clear()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
953 _active.clear()
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
954 _active.update(new_active)
eefb98379644 Merger 65032 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 47669
diff changeset
955 assert len(_active) == 1