annotate Lib/threading.py @ 73798:6cde416ef03b

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