Anyone seen a crash like this?
[backtrace]
0x000000000022926a <__assert_fail+26>
0x00000000003d3884 <lockfree::mutex::unlock()+548>
0x000000000041e889 <waitqueue::wait(lockfree::mutex&)+121>
0x00000000003e7aeb <futex(int*, int, int, timespec const*, int*,
int)+907>
0x00000000003e8086 <__syscall+1254>
The particular assert is this one:
while(true) {
wait_record *other = waitqueue.pop();
if (other) {
assert(other->thread() != sched::thread::current()); //
this thread isn't waiting, we know that :(
other->wake();
return;
}
// Some concurrent lock() is in progress (we know this because
of
// count) but it hasn't yet put itself on the wait queue.
if (++sequence == 0U) ++sequence; // pick a number, but not 0
auto ourhandoff = sequence;
handoff.store(ourhandoff);
// If the queue is empty, the concurrent lock() is before
adding
// itself, and therefore will definitely find our handoff
later.
if (waitqueue.empty())
return;
// A thread already appeared on the queue, let's try to take
the
// handoff ourselves and awaken it. If somebody else already
took
// the handoff, great, we're done - they are responsible now.
if (!handoff.compare_exchange_strong(ourhandoff, 0U))
return;
}
Unfortunately, I don't have this trapped in gdb yet, so hard to do any
further debugging. We're working on that - but just wondered if anyone
had tripped over something similar?
Rick
--
You received this message because you are subscribed to the Google Groups "OSv
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.