[cfe-dev] [libc++] Patch to fix futures unit test hangs on Linux

Andrew C. Morrow andrew.c.morrow at gmail.com
Thu May 24 20:57:43 PDT 2012

Hi -

I've recently been trying to get the mainline libc++ unit tests to
pass on Linux (Ubuntu 12.04 x86_64). The following tests

    libc++ :: thread/futures/futures.promise/alloc_ctor.pass.cpp
    libc++ :: thread/futures/futures.promise/move_assign.pass.cpp
    libc++ :: thread/futures/futures.promise/move_ctor.pass.cpp
    libc++ :: thread/futures/futures.shared_future/dtor.pass.cpp
    libc++ :: thread/futures/futures.unique_future/dtor.pass.cpp

were hanging indefinitely, with stacks like this:

#0  __lll_lock_wait_private () at
#1  0x00007ffff7bc8bf7 in _L_lock_21 () from
#2  0x00007ffff7bc8a6e in __pthread_cond_destroy (cond=0x40e050) at
#3  0x00007ffff7fcefdb in std::__1::__assoc_sub_state::~__assoc_sub_state() ()
   from libc++.so.1
#4  0x00000000004027df in
>::__on_zero_shared() ()
#5  0x00007ffff7f9529d in std::__1::__shared_count::__release_shared() ()
   from libc++.so.1
#6  0x00007ffff7fce93d in std::__1::promise<void>::~promise() ()
   from libc++.so.1
#7  0x0000000000401a88 in main ()

I noticed that in __assoc_sub_state_alloc<Alloc>::__on_zero_shared
there are actually two explicit calls to the destructor for 'this',
which seems wrong to me. After arbitrarily removing the call to
this->~base(), leaving just the one call to
this->~assoc_sub_state_alloc(), the tests listed above no longer hang
in my environment. I've attached that edit as a patch.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: sub_state_alloc.patch
Type: application/octet-stream
Size: 427 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120524/bbefebfc/attachment.obj>

More information about the cfe-dev mailing list