X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fthread.C;h=c2f3321d7987a28f85f90bf65b83078bb65cc72d;hb=b55798fc64eee00c6fab3b4763e791befb7275f9;hp=2a8c33814a99f0cdbd4ae4a7438009a2641b964c;hpb=5a1b2bb96f2bd6b7ef4f8031763683726c02219d;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/thread.C b/cinelerra-5.1/guicast/thread.C index 2a8c3381..c2f3321d 100644 --- a/cinelerra-5.1/guicast/thread.C +++ b/cinelerra-5.1/guicast/thread.C @@ -2,21 +2,21 @@ /* * CINELERRA * Copyright (C) 2008 Adam Williams - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * */ #include "bcsignals.h" @@ -65,8 +65,8 @@ void* Thread::entrypoint(void *parameters) thread->run(); thread->finished = true; if( !thread->synchronous ) { - if( !thread->cancelled ) TheList::dbg_del(thread->tid); if( thread->autodelete ) delete thread; + else if( !thread->cancelled ) TheList::dbg_del(thread->tid); else thread->tid = ((pthread_t)-1); } return NULL; @@ -106,9 +106,13 @@ void Thread::start() perror("Thread::start pthread_attr_setinheritsched"); } +// autodelete may delete this immediately after create + int autodelete = this->autodelete; + 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() @@ -127,9 +131,14 @@ int Thread::join() // join this thread { 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); - 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); @@ -141,7 +150,7 @@ int Thread::join() // join this thread while( running() && !cancelled ) { int ret = pthread_kill(tid, 0); if( ret ) break; - usleep(200000); + usleep(10000); } tid = ((pthread_t)-1); }