19 #ifndef INCLUDED_OSL_DIAGNOSE_HXX
20 #define INCLUDED_OSL_DIAGNOSE_HXX
29 #include <config_global.h>
32 #define BOOST_NO_0X_HDR_TYPEINDEX
34 #include <boost/unordered_set.hpp>
46 struct ObjectRegistryData;
53 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses(
57 SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
58 ::osl::detail::ObjectRegistryData
const& rData, ::std::size_t nExpected )
61 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_registerObject(
62 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
65 SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
66 ::osl::detail::ObjectRegistryData & rData,
void const* pObj )
72 #pragma clang diagnostic push
75 #pragma clang diagnostic ignored "-Wunknown-pragmas"
76 #pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
79 SAL_DLLPUBLIC ::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
83 #pragma clang diagnostic pop
92 struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> {
93 ::std::size_t operator()(
void const* p )
const {
94 ::std::size_t
const d =
static_cast< ::std::size_t
>(
95 reinterpret_cast< ::std::ptrdiff_t
>(p) );
100 typedef ::boost::unordered_set<void const*, VoidPtrHash, ::std::equal_to<void const*> > VoidPointerSet;
102 struct ObjectRegistryData {
103 ObjectRegistryData( ::std::type_info
const& rTypeInfo )
104 : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(),
105 m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){}
107 char const*
const m_pName;
109 VoidPointerSet m_addresses;
110 bool const m_bStoreAddresses;
113 template <
typename T>
117 ObjectRegistry() : m_data( typeid(T) ) {}
118 ~ObjectRegistry() { checkObjectCount(0); }
120 bool checkObjectCount( ::std::size_t nExpected )
const {
121 bool const bRet = osl_detail_ObjectRegistry_checkObjectCount(
123 if (!bRet && m_data.m_bStoreAddresses) {
124 MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
126 VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin());
127 VoidPointerSet::const_iterator
const iEnd(m_data.m_addresses.end());
128 for ( ; iPos != iEnd; ++iPos ) {
129 SAL_WARN_IF( *iPos == 0,
"sal.debug",
"null pointer" );
135 void registerObject(
void const* pObj ) {
136 osl_detail_ObjectRegistry_registerObject(m_data, pObj);
139 void revokeObject(
void const* pObj ) {
140 osl_detail_ObjectRegistry_revokeObject(m_data, pObj);
145 ObjectRegistry( ObjectRegistry
const& );
146 ObjectRegistry
const& operator=( ObjectRegistry
const& );
148 ObjectRegistryData m_data;
174 template <
typename InheritingClassT>
178 #if OSL_DEBUG_LEVEL <= 0
179 static bool checkObjectCount( ::std::size_t = 0 ) {
return true; }
180 #else // OSL_DEBUG_LEVEL > 0
184 static bool checkObjectCount( ::std::size_t nExpected = 0 ) {
185 return StaticObjectRegistry::get().checkObjectCount(nExpected);
190 StaticObjectRegistry::get().registerObject(
this );
193 StaticObjectRegistry::get().revokeObject(
this );
197 struct StaticObjectRegistry
199 StaticObjectRegistry> {};
207 #endif // ! defined( INCLUDED_OSL_DIAGNOSE_HXX)
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
Definition: conditn.hxx:30
#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_DLLPUBLIC
Definition: saldllapi.h:30
#define SAL_THROW_EXTERN_C()
Nothrow specification for C functions.
Definition: types.h:367
Guard< Mutex > MutexGuard
Definition: mutex.hxx:238