28 #ifndef OSL_DIAGNOSE_HXX_INCLUDED
29 #define OSL_DIAGNOSE_HXX_INCLUDED
36 #include "boost/unordered_set.hpp"
50 struct ObjectRegistryData;
57 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses(
61 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
62 ::osl::detail::ObjectRegistryData
const& rData, ::std::size_t nExpected )
65 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_registerObject(
66 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
69 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
70 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
77 #pragma clang diagnostic push
80 #pragma clang diagnostic ignored "-Wunknown-pragmas"
81 #pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
84 SAL_DLLPUBLIC ::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
88 #pragma clang diagnostic pop
98 struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> {
99 ::std::size_t operator()(
void const* p )
const {
100 ::std::size_t
const d =
static_cast< ::std::size_t
>(
101 reinterpret_cast< ::std::ptrdiff_t
>(p) );
106 typedef ::boost::unordered_set<void const*, VoidPtrHash, ::std::equal_to<void const*>,
107 ::rtl::Allocator<void const*> > VoidPointerSet;
109 struct ObjectRegistryData {
110 ObjectRegistryData( ::std::type_info
const& rTypeInfo )
111 : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(),
112 m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){}
114 char const*
const m_pName;
116 VoidPointerSet m_addresses;
117 bool const m_bStoreAddresses;
120 template <
typename T>
124 ObjectRegistry() : m_data( typeid(T) ) {}
125 ~ObjectRegistry() { checkObjectCount(0); }
127 bool checkObjectCount( ::std::size_t nExpected )
const {
128 bool const bRet = osl_detail_ObjectRegistry_checkObjectCount(
130 if (!bRet && m_data.m_bStoreAddresses) {
131 MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
133 VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin());
134 VoidPointerSet::const_iterator
const iEnd(m_data.m_addresses.end());
135 for ( ; iPos != iEnd; ++iPos ) {
136 SAL_WARN_IF( *iPos == 0,
"sal.debug",
"null pointer" );
142 void registerObject(
void const* pObj ) {
143 osl_detail_ObjectRegistry_registerObject(m_data, pObj);
146 void revokeObject(
void const* pObj ) {
147 osl_detail_ObjectRegistry_revokeObject(m_data, pObj);
152 ObjectRegistry( ObjectRegistry
const& );
153 ObjectRegistry
const& operator=( ObjectRegistry
const& );
155 ObjectRegistryData m_data;
181 template <
typename InheritingClassT>
185 #if OSL_DEBUG_LEVEL <= 0
186 static bool checkObjectCount( ::std::size_t = 0 ) {
return true; }
187 #else // OSL_DEBUG_LEVEL > 0
191 static bool checkObjectCount( ::std::size_t nExpected = 0 ) {
192 return StaticObjectRegistry::get().checkObjectCount(nExpected);
197 StaticObjectRegistry::get().registerObject(
this );
200 StaticObjectRegistry::get().revokeObject(
this );
204 struct StaticObjectRegistry
206 StaticObjectRegistry> {};
214 #endif // ! defined(OSL_DIAGNOSE_HXX_INCLUDED)