28 #ifndef OSL_DIAGNOSE_HXX_INCLUDED
29 #define OSL_DIAGNOSE_HXX_INCLUDED
37 #define BOOST_NO_0X_HDR_TYPEINDEX
39 #include "boost/unordered_set.hpp"
53 struct ObjectRegistryData;
60 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses(
64 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
65 ::osl::detail::ObjectRegistryData
const& rData, ::std::size_t nExpected )
68 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_registerObject(
69 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
72 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
73 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
80 #pragma clang diagnostic push
83 #pragma clang diagnostic ignored "-Wunknown-pragmas"
84 #pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
87 SAL_DLLPUBLIC ::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
91 #pragma clang diagnostic pop
101 struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> {
102 ::std::size_t operator()(
void const* p )
const {
103 ::std::size_t
const d =
static_cast< ::std::size_t
>(
104 reinterpret_cast< ::std::ptrdiff_t
>(p) );
109 typedef ::boost::unordered_set<void const*, VoidPtrHash, ::std::equal_to<void const*>,
110 ::rtl::Allocator<void const*> > VoidPointerSet;
112 struct ObjectRegistryData {
113 ObjectRegistryData( ::std::type_info
const& rTypeInfo )
114 : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(),
115 m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){}
117 char const*
const m_pName;
119 VoidPointerSet m_addresses;
120 bool const m_bStoreAddresses;
123 template <
typename T>
127 ObjectRegistry() : m_data( typeid(T) ) {}
128 ~ObjectRegistry() { checkObjectCount(0); }
130 bool checkObjectCount( ::std::size_t nExpected )
const {
131 bool const bRet = osl_detail_ObjectRegistry_checkObjectCount(
133 if (!bRet && m_data.m_bStoreAddresses) {
134 MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
136 VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin());
137 VoidPointerSet::const_iterator
const iEnd(m_data.m_addresses.end());
138 for ( ; iPos != iEnd; ++iPos ) {
139 SAL_WARN_IF( *iPos == 0,
"sal.debug",
"null pointer" );
145 void registerObject(
void const* pObj ) {
146 osl_detail_ObjectRegistry_registerObject(m_data, pObj);
149 void revokeObject(
void const* pObj ) {
150 osl_detail_ObjectRegistry_revokeObject(m_data, pObj);
155 ObjectRegistry( ObjectRegistry
const& );
156 ObjectRegistry
const& operator=( ObjectRegistry
const& );
158 ObjectRegistryData m_data;
184 template <
typename InheritingClassT>
188 #if OSL_DEBUG_LEVEL <= 0
189 static bool checkObjectCount( ::std::size_t = 0 ) {
return true; }
190 #else // OSL_DEBUG_LEVEL > 0
194 static bool checkObjectCount( ::std::size_t nExpected = 0 ) {
195 return StaticObjectRegistry::get().checkObjectCount(nExpected);
200 StaticObjectRegistry::get().registerObject(
this );
203 StaticObjectRegistry::get().revokeObject(
this );
207 struct StaticObjectRegistry
209 StaticObjectRegistry> {};
217 #endif // ! defined(OSL_DIAGNOSE_HXX_INCLUDED)