Subject: assert failed in pthread_run.c
To: None <current-users@netbsd.org>
From: Brian Stark <bpstark@pacbell.net>
List: current-users
Date: 02/01/2004 03:00:15
Hi,
While working on one of my motif demo programs tonight I saw this error
come out of libpthread:
assertion "next != 0" failed: file
"/usr/src/lib/libpthread/pthread_run.c", line 124, function
"pthread__next"
Abort (core dumped)
I have a coredump. Here is the stack trace from gdb:
(gdb) where
#0 0x4851196b in kill () from /usr/lib/libc.so.12
#1 0x484d6ca6 in pthread__assertfunc () from /usr/lib/libpthread.so.0
#2 0x484d3518 in pthread__next () from /usr/lib/libpthread.so.0
#3 0x484d33fd in pthread__block () from /usr/lib/libpthread.so.0
#4 0x484d3f16 in pthread_mutex_lock () from /usr/lib/libpthread.so.0
#5 0x484d3df3 in pthread_mutex_lock () from /usr/lib/libpthread.so.0
#6 0x4856c484 in __cxa_atexit () from /usr/lib/libc.so.12
#7 0x4856c65b in atexit () from /usr/lib/libc.so.12
#8 0x0804c82e in ~AboutDialog (this=0x80724c0) at AboutDialog.C:29
#9 0x08056e70 in __tcf_4 () at callbacks.C:206
#10 0x4856c606 in __cxa_finalize () from /usr/lib/libc.so.12
#11 0x4856c3f6 in exit () from /usr/lib/libc.so.12
#12 0x0804b3ab in ___start ()
(gdb)
My version of pthread_run.c is:
$NetBSD: pthread_run.c,v 1.16 2004/01/16 15:23:31 cl Exp $
I am running NetBSD 1.6ZH/i386.
Here is the relevant section from pthread_run.c:
/* Get the next thread to switch to. Will never return NULL. */
pthread_t
pthread__next(pthread_t self)
{
pthread_t next;
pthread_spinlock(self, &pthread__runqueue_lock);
next = PTQ_FIRST(&pthread__runqueue);
if (next) {
pthread__assert(next->pt_type == PT_THREAD_NORMAL);
PTQ_REMOVE(&pthread__runqueue, next, pt_runq);
SDPRINTF(("(next %p) returning thread %p\n", self, next));
} else {
next = PTQ_FIRST(&pthread__idlequeue);
LINE 124--> pthread__assert(next != 0);
PTQ_REMOVE(&pthread__idlequeue, next, pt_runq);
pthread__assert(next->pt_type == PT_THREAD_IDLE);
SDPRINTF(("(next %p) returning idle thread %p\n", self,
next));
}
pthread_spinunlock(self, &pthread__runqueue_lock);
return next;
}
Here is the relevant section from my program (showing the AboutDialog
destructor):
AboutDialog::~AboutDialog()
{
static const string methodName("~AboutDialog"); <-- LINE 29
logEntryExitClass logEntryExit(fileName,__LINE__,m_className,methodName);
destroy();
}
My test program has a dedicated thread for processing log messages (the
logEntryExitClass issues a log message in its constructor and another log
message in its destructor to trace entry/exit for the method, the
destroy() method call takes care of destroying some motif resources). I
have not run across this error message before and am not sure what to think.
Following some advice from others about PTHREAD_DIAGASSERT, I enabled some
environment variables but did not get any extra output:
export PTHREAD_DIAGASSERT="el"
export PTHREAD_DEBUGCOUNTERS="YES"
./xmdemo
assertion "next != 0" failed: file
"/usr/src/lib/libpthread/pthread_run.c", line 124, function
"pthread__next"
Abort (core dumped)
Anyone else seen this, or have a clue as to what is wrong?
Brian Stark
bpstark at pacbell dot net