
Jerry Lawson wrote:
On sparc/gcc environment, boost/detail/sp_counted_base.hpp will use sp_counted_base_pt.hpp, which of course implements counter protection via pthread_mutex operations. Other gcc-environments (x86, x64, ia64, ppc) have the concept of using asm directives for atomic increment & decrement, which obviously is more efficient than the mutex operations.
The boost/detail/atomic_count_gcc.hpp implementation seems like a more efficient mechanism for incrementing/decrementing the shared_ptr reference counters. In fact, the shared_ptr_nmt.hpp implementation does use boost::detail::atomic_count for the reference count (albeit directly, rather than through the shared_count template).
I am using atomic_count as the basis for my internal reference counting for my intrusive_ptr-based objects and am happy with this.
So I'm curious as to why sp_counted_base.hpp does not use the atomic increment/decrement model for sparc/gcc that it does for other gcc environments?
The primitives supplied by g++ were not enough to support sp_counted_base (although this is going to change in 4.2, I think). There is an assembly language version scheduled for 1.35 in the CVS. You can play with it by downloading http://boost.cvs.sourceforge.net/*checkout*/boost/boost/boost/detail/sp_coun... and applying the patch http://boost.cvs.sourceforge.net/boost/boost/boost/detail/sp_counted_base.hpp?r1=1.8&r2=1.9 There is currently a problem with 64-bit SPARCs in 32-bit mode, where the default architecture isn't v9 (g++ doesn't support the notion of v8+). We're looking into fixing that on the bjam side.