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;
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()
while( running() && !cancelled ) {
int ret = pthread_kill(tid, 0);
if( ret ) break;
- usleep(200000);
+ usleep(10000);
}
tid = ((pthread_t)-1);
}