Refcounting smart pointer?
Bill Baxter
wbaxter at gmail.com
Wed Sep 3 17:42:55 PDT 2008
I don't think such things usually are thread safe.
At least Boost's is not:
http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/shared_ptr.htm#ThreadSafety
--bb
On Thu, Sep 4, 2008 at 9:33 AM, Jason House <jason.james.house at gmail.com> wrote:
> Your implementation is not thread safe...
>
> Sönke Ludwig Wrote:
>
>> Bill Baxter schrieb:
>> > Has anyone made a reference counting smart pointer using D2 structs yet?
>> > It should be possible now with the opDot, destructors, postblit thingy
>> > and constructor.
>> >
>> > Is anything missing to make it work? Actually I don't even think the
>> > constructor was necessary. So someone probably could have done this a
>> > while ago.
>> >
>> > --bb
>>
>> Just implemented this today, and it seems to work fine:
>>
>> struct CountedRef(T) {
>> static if( is(T == class) ){
>> alias T T_ref;
>> } else {
>> alias T* T_ref;
>> }
>>
>> private {
>> T_ref m_object;
>> int* m_refcount;
>> }
>>
>> this(T_ref obj){
>> m_object = obj;
>> m_refcount = new int;
>> *m_refcount = 1;
>> }
>>
>> ~this(){
>> if( m_refcount && --(*m_refcount) <= 0 ){
>> delete m_object;
>> delete m_refcount;
>> }
>> }
>>
>> this(this){
>> if( m_refcount )
>> (*m_refcount)++;
>> }
>>
>> T_ref get(){ return m_object; }
>> const(T_ref) get() const { return m_object; }
>>
>> T_ref opDot(){ return m_object; }
>> const(T_ref) opDot() const { return m_object; }
>> }
>>
>> struct IntrusiveCountedRef(T) {
>> static if( is(T == class) ){
>> alias T T_ref;
>> } else {
>> alias T* T_ref;
>> }
>>
>> private {
>> T_ref m_object;
>> }
>>
>> this(T_ref obj){
>> m_object = obj;
>> obj.addRef();
>> }
>>
>> ~this(){
>> if( m_object )
>> m_object.releaseRef();
>> }
>>
>> this(this){
>> if( m_object )
>> m_object.addRef();
>> }
>>
>> T_ref get(){ return m_object; }
>> const(T_ref) get() const { return m_object; }
>>
>> T_ref opDot(){ return m_object; }
>> const(T_ref) opDot() const { return m_object; }
>> }
>
>
More information about the Digitalmars-d
mailing list