ifndef Rice__Address_Registration_Guard_defn__hpp_ define Rice__Address_Registration_Guard_defn__hpp_
include “Object_defn.hpp” include “detail/ruby.hpp” include “detail/Not_Copyable.hpp”
namespace Rice {
//! A guard to register a given address with the GC.
! Calls rb_gc_register_address upon construction and rb_gc_unregister_address upon destruction. For example: \code Class Foo { public: Foo() : string_(rb_str_new2()) , guard_(&string_); private: VALUE string_; Address_Registration_Guard guard_; }; \endcode
class Address_Registration_Guard
: private detail::Not_Copyable
{ public:
//! Register an address with the GC. /* \param address The address to register with the GC. The address must point to a valid ruby object (RObject). / Address_Registration_Guard(VALUE * address); //! Register an Object with the GC. /*! \param object The Object to register with the GC. The object must not be destroyed before the Address_Registration_Guard is destroyed. / Address_Registration_Guard(Object * object); //! Unregister an address/Object with the GC. /*! Destruct an Address_Registration_Guard. The address registered with the Address_Registration_Guard when it was constructed will be unregistered from the GC. / ~Address_Registration_Guard(); //! Get the address that is registered with the GC. VALUE * address() const; //! Swap with another Address_Registration_Guard. void swap(Address_Registration_Guard & other); /** Called during Ruby's exit process since we should not call rb_gc unregister_address there / static void disable();
private:
static bool enabled; static bool exit_handler_registered; static void registerExitHandler(); VALUE * address_;
};
} // namespace Rice
endif // Rice__Address_Registration_Guard_defn__hpp_