Hi,

I have studied the sp_counted_base implementation and I can't see how it is trade safe.

For instance:

 bool add_ref_lock() // true on success
    {
        pthread_mutex_lock( &m_ );
        bool r = use_count_ == 0? false: ( ++use_count_, true );
        pthread_mutex_unlock( &m_ );
        return r;
    }

 void release() // nothrow
    {
        pthread_mutex_lock( &m_ );
        long new_use_count = --use_count_;
        pthread_mutex_unlock( &m_ );

        if( new_use_count == 0 )
        {
            dispose();
            weak_release();
        }
    }

I suppose to exist a race condition because I can't execute the comparation "if( new_use_count) == 0" outside of  critical region delimited by mutex.

So if:

1. Reference count = 1
2. Thread A executes release and is interrupted after execute the comparation if( new_use_count) == 0 (the comparation returns true)
3. Thread B executes add_ref_lock, then Ref count = 1
4. Thread A executes "dispose()" and releases the pointer !

What Do you think about ?

Eduardo Panisset.