projects
/
goodguy
/
history.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
memory leaks and tweaks, sams histeq icon
[goodguy/history.git]
/
cinelerra-5.1
/
guicast
/
thread.C
diff --git
a/cinelerra-5.1/guicast/thread.C
b/cinelerra-5.1/guicast/thread.C
index 6cde612dfdfbb853902f02e423bc39699817bf18..b27f43a25856198a5e82909b4d788cb677970dad 100644
(file)
--- a/
cinelerra-5.1/guicast/thread.C
+++ b/
cinelerra-5.1/guicast/thread.C
@@
-65,8
+65,8
@@
void* Thread::entrypoint(void *parameters)
thread->run();
thread->finished = true;
if( !thread->synchronous ) {
thread->run();
thread->finished = true;
if( !thread->synchronous ) {
- if( !thread->cancelled ) TheList::dbg_del(thread->tid);
if( thread->autodelete ) delete thread;
if( thread->autodelete ) delete thread;
+ else if( !thread->cancelled ) TheList::dbg_del(thread->tid);
else thread->tid = ((pthread_t)-1);
}
return NULL;
else thread->tid = ((pthread_t)-1);
}
return NULL;
@@
-106,9
+106,13
@@
void Thread::start()
perror("Thread::start pthread_attr_setinheritsched");
}
perror("Thread::start pthread_attr_setinheritsched");
}
+// autodelete may delete this immediately after create
+ int autodelete = this->autodelete;
+
pthread_create(&tid, &attr, Thread::entrypoint, this);
pthread_create(&tid, &attr, Thread::entrypoint, this);
- TheList::dbg_add(tid, owner, typeid(*this).name());
+ if( !autodelete )
+ TheList::dbg_add(tid, owner, typeid(*this).name());
}
int Thread::cancel()
}
int Thread::cancel()
@@
-127,9
+131,14
@@
int Thread::join() // join this thread
{
if( !exists() ) return 0;
if( synchronous ) {
{
if( !exists() ) return 0;
if( synchronous ) {
-// NOTE: this does not do anything if the thread is not synchronous
+// NOTE: this fails if the thread is not synchronous or
+// or another thread is already waiting to join.
int ret = pthread_join(tid, 0);
int ret = pthread_join(tid, 0);
- if( ret ) strerror(ret);
+ if( ret ) {
+ fflush(stdout);
+ fprintf(stderr, "Thread %p: %s\n", (void*)tid, strerror(ret));
+ fflush(stderr);
+ }
CLEAR_LOCKS_TID(tid);
TheList::dbg_del(tid);
tid = ((pthread_t)-1);
CLEAR_LOCKS_TID(tid);
TheList::dbg_del(tid);
tid = ((pthread_t)-1);