[Virtual-pkg-base-maintainers] Bug#763907: Thread never continues after wait
Larry Kimminau
larry at a-concept.com
Fri Oct 3 16:43:45 UTC 2014
Package: base
Severity: important
Dear Maintainer,
*** Please consider answering these questions, where appropriate ***
* What led up to the situation?
Migrated an existing running application to Debian.
* What exactly did you do (or not do) that was effective (or
ineffective)?
Attempted to use all techniques recommended (via web search) to delay a
thread for specified period of time.
None were successful.
The code runs correctly without problem on Angstrom.
* What was the outcome of this action?
Thread never returns after calling wait function (nanosleep,
pthread_cond_timedwait, etc.).
* What outcome did you expect instead?
Thread would delay for specified time, then continue execution.
-- System Information:
Debian Release: 7.5
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: armhf (armv7l)
Foreign Architectures: armel
Kernel: Linux 3.8.13-bone50 (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Additional info - sample code:
// NOTE: for linux, any executables that link with WebApi must also
// link with librt.so, this can be done by adding the "pthread"
library dependency
// or adding the "-lpthread" linker option
# include <pthread.h>
# include <time.h>
# include <unistd.h>
# include <sys/select.h>
# include <signal.h>
Thread::Thread(THREAD_FN threadFn, PVOID param/*=NULL*/)
: m_thread(threadFn)
, m_param(param)
, m_id(-1)
{
m_mtxWait = PTHREAD_MUTEX_INITIALIZER;
m_condWait = PTHREAD_COND_INITIALIZER;
pthread_mutex_init(&m_mtxWait, NULL);
pthread_cond_init(&m_condWait, NULL);
}
Thread::~Thread()
{
cancel();
pthread_mutex_destroy(&m_mtxWait);
pthread_cond_destroy(&m_condWait);
}
bool Thread::start(PVOID param/*= NULL*/)
{
bool rc(false);
if (NULL != m_thread && -1 == m_id) {
rc = (0 == pthread_create(&m_id, NULL, m_thread, param != NULL ?
param : m_param));
}
#if defined(DEBUG)
else {
printf("Thread::start thread already running\n");
}
#endif
return(rc);
}
bool Thread::cancel(PVOID* retval/*=NULL*/)
{
bool rc(false);
if (-1 != m_id) {
pthread_cancel(m_id);
rc = pthread_join(m_id, retval);
m_id = -1;
}
#if defined(DEBUG)
else {
printf("Thread::cancel thread not running\n");
}
#endif
return(rc);
}
void Thread::wait(WAITTIME delay)
{
# define nS_PER_S 1000000000
# define mS_PER_S 1000
# define nS_PER_mS (nS_PER_S/mS_PER_S)
# if 0
// BUGBUGBUG : This doesn't work on Debian
nanosleep(&delay);
# else
// BUGBUGBUG : This also doesn't work on Debian
struct timespec abs;
u_int64_t totNs;
int retval;
clock_gettime(CLOCK_REALTIME, &abs);
totNs = abs.tv_nsec + delay.tv_nsec;
abs.tv_nsec = totNs % nS_PER_S;
totNs /= nS_PER_S;
abs.tv_sec += delay.tv_sec + (long)totNs; // add 1 so timer goes
off first
pthread_mutex_lock(&m_mtxWait);
retval = /**/ pthread_cond_timedwait(&m_condWait, &m_mtxWait, &abs);
//*/ nanosleep(reltime, NULL);
pthread_mutex_unlock(&m_mtxWait);
}
Calling code:
void* syncThread(void* param);
Thread threadObject(syncThread);
syncThread.start();
void* syncThread(void* param);
{
struct timespec delay = {1, 0};
threadObject.wait(delay);
// NEVER GETS HERE
}
More information about the Virtual-pkg-base-maintainers
mailing list