http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46455

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-11-15 
12:26:24 UTC ---
Could you try this, which is a simplified version of the shared_ptr refcounting
code and should have the same behaviour:

#include <ext/atomicity.h>
#include <ext/concurrence.h>
#include <assert.h>

static int count0 = 0;

struct X
{
    X() : count1(1), count2(1) { ++count0; }

    ~X() { assert( count1==0 ); assert( count2==0 ); --count0; }

    void release()
    {
        if (__gnu_cxx::__exchange_and_add_dispatch(&count1, -1) == 1)
        {
            if (__gnu_cxx::__exchange_and_add_dispatch(&count2, -1) == 1)
                delete this;
        }
    }

    __gnu_cxx::__mutex m;
    _Atomic_word count1;
    _Atomic_word count2;
};

int main()
{
    for (int i=0; i<100; ++i)
    {
        X* x = new X;
        x->release();
    }
    assert( count0 == 0 );
}

Reply via email to