[libcxx] r277357 - Improve shared_ptr dtor performance

Asiri Rathnayake via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 2 02:20:43 PDT 2016


Hi Ben,

Looks like there's a typo in this patch that is causing a buildbot failure:
http://lab.llvm.org:8011/builders/libcxx-libcxxabi-singlethreaded-x86_64-linux-debian/builds/1128/steps/build.libcxx/logs/stdio

Also seen in our local builders. I will fix it if I get around to it before
you :)

Cheers,

/ Asiri



On Mon, Aug 1, 2016 at 6:51 PM, Ben Craig via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: bcraig
> Date: Mon Aug  1 12:51:26 2016
> New Revision: 277357
>
> URL: http://llvm.org/viewvc/llvm-project?rev=277357&view=rev
> Log:
> Improve shared_ptr dtor performance
>
> If the last destruction is uncontended, skip the atomic store on
> __shared_weak_owners_. This shifts some costs from normal
> shared_ptr usage to weak_ptr uses.
>
> https://reviews.llvm.org/D22470
>
> Modified:
>     libcxx/trunk/src/memory.cpp
>
> Modified: libcxx/trunk/src/memory.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/memory.cpp?rev=277357&r1=277356&r2=277357&view=diff
>
> ==============================================================================
> --- libcxx/trunk/src/memory.cpp (original)
> +++ libcxx/trunk/src/memory.cpp Mon Aug  1 12:51:26 2016
> @@ -96,7 +96,35 @@ __shared_weak_count::__release_shared()
>  void
>  __shared_weak_count::__release_weak() _NOEXCEPT
>  {
> -    if (decrement(__shared_weak_owners_) == -1)
> +    // NOTE: The acquire load here is an optimization of the very
> +    // common case where a shared pointer is being destructed while
> +    // having no other contended references.
> +    //
> +    // BENEFIT: We avoid expensive atomic stores like XADD and STREX
> +    // in a common case.  Those instructions are slow and do nasty
> +    // things to caches.
> +    //
> +    // IS THIS SAFE?  Yes.  During weak destruction, if we see that we
> +    // are the last reference, we know that no-one else is accessing
> +    // us. If someone were accessing us, then they would be doing so
> +    // while the last shared / weak_ptr was being destructed, and
> +    // that's undefined anyway.
> +    //
> +    // If we see anything other than a 0, then we have possible
> +    // contention, and need to use an atomicrmw primitive.
> +    // The same arguments don't apply for increment, where it is legal
> +    // (though inadvisable) to share shared_ptr references between
> +    // threads, and have them all get copied at once.  The argument
> +    // also doesn't apply for __release_shared, because an outstanding
> +    // weak_ptr::lock() could read / modify the shared count.
> +    if (__libcpp_atomic_load(&__shared_weak_owners_, _AO_Aquire) == 0)
> +    {
> +        // no need to do this store, because we are about
> +        // to destroy everything.
> +        //__libcpp_atomic_store(&__shared_weak_owners_, -1, _AO_Release);
> +        __on_zero_shared_weak();
> +    }
> +    else if (decrement(__shared_weak_owners_) == -1)
>          __on_zero_shared_weak();
>  }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160802/760fb46e/attachment.html>


More information about the cfe-commits mailing list