19 #ifndef INCLUDED_OSL_DIAGNOSE_HXX
20 #define INCLUDED_OSL_DIAGNOSE_HXX
27 #include <config_global.h>
30 #define BOOST_NO_0X_HDR_TYPEINDEX
32 #include <boost/unordered_set.hpp>
47 struct ObjectRegistryData;
54 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses(
58 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
59 ::osl::detail::ObjectRegistryData
const& rData, ::std::size_t nExpected )
62 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_registerObject(
63 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
66 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
67 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
73 #pragma clang diagnostic push
76 #pragma clang diagnostic ignored "-Wunknown-pragmas"
77 #pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
80 SAL_DLLPUBLIC ::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
84 #pragma clang diagnostic pop
93 struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> {
94 ::std::size_t operator()(
void const* p )
const {
95 ::std::size_t
const d =
static_cast< ::std::size_t
>(
96 reinterpret_cast< ::std::ptrdiff_t
>(p) );
101 typedef ::boost::unordered_set<void const*, VoidPtrHash, ::std::equal_to<void const*>,
102 ::rtl::Allocator<void const*> > VoidPointerSet;
104 struct ObjectRegistryData {
105 ObjectRegistryData( ::std::type_info
const& rTypeInfo )
106 : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(),
107 m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){}
109 char const*
const m_pName;
111 VoidPointerSet m_addresses;
112 bool const m_bStoreAddresses;
115 template <
typename T>
119 ObjectRegistry() : m_data( typeid(T) ) {}
120 ~ObjectRegistry() { checkObjectCount(0); }
122 bool checkObjectCount( ::std::size_t nExpected )
const {
123 bool const bRet = osl_detail_ObjectRegistry_checkObjectCount(
125 if (!bRet && m_data.m_bStoreAddresses) {
126 MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
128 VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin());
129 VoidPointerSet::const_iterator
const iEnd(m_data.m_addresses.end());
130 for ( ; iPos != iEnd; ++iPos ) {
131 SAL_WARN_IF( *iPos == 0,
"sal.debug",
"null pointer" );
137 void registerObject(
void const* pObj ) {
138 osl_detail_ObjectRegistry_registerObject(m_data, pObj);
141 void revokeObject(
void const* pObj ) {
142 osl_detail_ObjectRegistry_revokeObject(m_data, pObj);
147 ObjectRegistry( ObjectRegistry
const& );
148 ObjectRegistry
const& operator=( ObjectRegistry
const& );
150 ObjectRegistryData m_data;
176 template <
typename InheritingClassT>
180 #if OSL_DEBUG_LEVEL <= 0
181 static bool checkObjectCount( ::std::size_t = 0 ) {
return true; }
182 #else // OSL_DEBUG_LEVEL > 0
186 static bool checkObjectCount( ::std::size_t nExpected = 0 ) {
187 return StaticObjectRegistry::get().checkObjectCount(nExpected);
192 StaticObjectRegistry::get().registerObject(
this );
195 StaticObjectRegistry::get().revokeObject(
this );
199 struct StaticObjectRegistry
201 StaticObjectRegistry> {};
209 #endif // ! defined( INCLUDED_OSL_DIAGNOSE_HXX)
#define SAL_WARN_IF(condition, area, stream)
Produce warning entry from stream in the given log area if condition is true.
Definition: log.hxx:304
#define SAL_THROW_EXTERN_C()
Definition: types.h:360
sal_Int32 oslInterlockedCount
Definition: interlck.h:32
Helper base class for a late-initialized (default-constructed) static variable, implementing the doub...
Definition: instance.hxx:399
#define SAL_DLLPUBLIC
Definition: saldllapi.h:30
Guard< Mutex > MutexGuard
Definition: mutex.hxx:238