
DOH!!! I found a killed a bug. It only existed in the C++ Abstraction API. It has to do with the fact that pointers to user objects are contained in the userstate<T>::m_state member. I was returning a pointer to the userstate<T>, rather than the userstate<T>::m_state member in the following functions: inline T* load_ptr() throw() { return static_cast<T*>(atomic_state_load_depends()); } inline T const* load_ptr() const throw() { return static_cast<T const*>(atomic_state_load_depends()); } They have to be changed to this: inline T* load_ptr() throw() { return static_cast<userstate<T>*>(atomic_state_load_depends())->m_state; } inline T const* load_ptr() const throw() { return static_cast<userstate<T>*>(atomic_state_load_depends())->m_state; } Also, you need to add this to the userstate<T> class: friend class ptr_base<T>; The code is fixed on my site. Sorry for any confusion! ;^(... Luckily, the bug was in the C++ layer, and not in the assembly! ;^)