mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
stdpy: fix issues with direct.stdpy.threading thread cleanup
Fixes: #164
This commit is contained in:
parent
a925e0bcd9
commit
1f017997f9
@ -227,10 +227,11 @@ def _remove_thread_id(threadId):
|
||||
|
||||
_threadsLock.acquire()
|
||||
try:
|
||||
thread, locals, wrapper = _threads[threadId]
|
||||
assert thread.getPythonIndex() == threadId
|
||||
del _threads[threadId]
|
||||
thread.setPythonIndex(-1)
|
||||
if threadId in _threads:
|
||||
thread, locals, wrapper = _threads[threadId]
|
||||
assert thread.getPythonIndex() == threadId
|
||||
del _threads[threadId]
|
||||
thread.setPythonIndex(-1)
|
||||
|
||||
finally:
|
||||
_threadsLock.release()
|
||||
|
@ -108,6 +108,7 @@ class Thread(ThreadBase):
|
||||
self.run()
|
||||
finally:
|
||||
self.__thread = None
|
||||
_thread._remove_thread_id(self.ident)
|
||||
|
||||
self.__thread = core.PythonThread(call_run, None, name, name)
|
||||
threadId = _thread._add_thread(self.__thread, weakref.proxy(self))
|
||||
@ -120,15 +121,17 @@ class Thread(ThreadBase):
|
||||
_thread._remove_thread_id(self.ident)
|
||||
|
||||
def is_alive(self):
|
||||
return self.__thread is not None and self.__thread.is_started()
|
||||
thread = self.__thread
|
||||
return thread is not None and thread.is_started()
|
||||
|
||||
isAlive = is_alive
|
||||
|
||||
def start(self):
|
||||
if self.__thread is None or self.__thread.is_started():
|
||||
thread = self.__thread
|
||||
if thread is None or thread.is_started():
|
||||
raise RuntimeError
|
||||
|
||||
if not self.__thread.start(core.TPNormal, True):
|
||||
if not thread.start(core.TPNormal, True):
|
||||
raise RuntimeError
|
||||
|
||||
def run(self):
|
||||
@ -142,8 +145,12 @@ class Thread(ThreadBase):
|
||||
def join(self, timeout = None):
|
||||
# We don't support a timed join here, sorry.
|
||||
assert timeout is None
|
||||
self.__thread.join()
|
||||
self.__thread = None
|
||||
thread = self.__thread
|
||||
if thread is not None:
|
||||
thread.join()
|
||||
# Clear the circular reference.
|
||||
self.__thread = None
|
||||
_thread._remove_thread_id(self.ident)
|
||||
|
||||
def setName(self, name):
|
||||
self.__dict__['name'] = name
|
||||
|
Loading…
x
Reference in New Issue
Block a user