diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:57:40 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:57:40 +0100 |
commit | 2716f7dce26f16a2b677c178aa7d01cea096ae47 (patch) | |
tree | 9e9f67205cd5b72f1031721273e1534a3a1e5b0f /sal/inc/osl/diagnose.hxx | |
parent | 10ac9e750447fd57e3cef7993b0ad6c6538d6269 (diff) |
replace obsolete "master" branch with README that points at new repoHEADmaster-deletedmaster
Diffstat (limited to 'sal/inc/osl/diagnose.hxx')
-rw-r--r-- | sal/inc/osl/diagnose.hxx | 207 |
1 files changed, 0 insertions, 207 deletions
diff --git a/sal/inc/osl/diagnose.hxx b/sal/inc/osl/diagnose.hxx deleted file mode 100644 index 211eb502f..000000000 --- a/sal/inc/osl/diagnose.hxx +++ /dev/null @@ -1,207 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#if ! defined(OSL_DIAGNOSE_HXX_INCLUDED) -#define OSL_DIAGNOSE_HXX_INCLUDED - -#if ! defined(_OSL_DIAGNOSE_H_) -#include "osl/diagnose.h" -#endif -#if ! defined(_OSL_INTERLOCK_H_) -#include "osl/interlck.h" -#endif -#if ! defined(_OSL_MUTEX_HXX_) -#include "osl/mutex.hxx" -#endif -#if ! defined(INCLUDED_RTL_ALLOCATOR_HXX) -#include "rtl/allocator.hxx" -#endif -#if ! defined(_RTL_INSTANCE_HXX_) -#include "rtl/instance.hxx" -#endif -#include <boost/unordered_set.hpp> -#include <functional> -#include <typeinfo> - -namespace osl { -/// @internal -namespace detail { - -struct ObjectRegistryData; - -} // namespace detail -} // namespace osl - -extern "C" { - -/** @internal */ -bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses( char const* pName ) - SAL_THROW_EXTERN_C(); - -/** @internal */ -bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount( - ::osl::detail::ObjectRegistryData const& rData, ::std::size_t nExpected ) - SAL_THROW_EXTERN_C(); - -/** @internal */ -void SAL_CALL osl_detail_ObjectRegistry_registerObject( - ::osl::detail::ObjectRegistryData & rData, void const* pObj ) - SAL_THROW_EXTERN_C(); - -/** @internal */ -void SAL_CALL osl_detail_ObjectRegistry_revokeObject( - ::osl::detail::ObjectRegistryData & rData, void const* pObj ) - SAL_THROW_EXTERN_C(); - -/** @internal */ -::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex() - SAL_THROW_EXTERN_C(); - -} // extern "C" - -namespace osl { - -/// @internal -namespace detail { - -struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> { - ::std::size_t operator()( void const* p ) const { - ::std::size_t const d = static_cast< ::std::size_t >( - reinterpret_cast< ::std::ptrdiff_t >(p) ); - return d + (d >> 3); - } -}; - -typedef ::boost::unordered_set<void const*, VoidPtrHash, ::std::equal_to<void const*>, - ::rtl::Allocator<void const*> > VoidPointerSet; - -struct ObjectRegistryData { - ObjectRegistryData( ::std::type_info const& rTypeInfo ) - : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(), - m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){} - - char const* const m_pName; - oslInterlockedCount m_nCount; - VoidPointerSet m_addresses; - bool const m_bStoreAddresses; -}; - -template <typename T> -class ObjectRegistry -{ -public: - ObjectRegistry() : m_data( typeid(T) ) {} - ~ObjectRegistry() { checkObjectCount(0); } - - bool checkObjectCount( ::std::size_t nExpected ) const { - bool const bRet = osl_detail_ObjectRegistry_checkObjectCount( - m_data, nExpected ); - if (!bRet && m_data.m_bStoreAddresses) { - MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() ); - // following loop is for debugging purposes, iterating over map: - VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin()); - VoidPointerSet::const_iterator const iEnd(m_data.m_addresses.end()); - for ( ; iPos != iEnd; ++iPos ) { - OSL_ASSERT( *iPos != 0 ); - } - } - return bRet; - } - - void registerObject( void const* pObj ) { - osl_detail_ObjectRegistry_registerObject(m_data, pObj); - } - - void revokeObject( void const* pObj ) { - osl_detail_ObjectRegistry_revokeObject(m_data, pObj); - } - -private: - // not impl: - ObjectRegistry( ObjectRegistry const& ); - ObjectRegistry const& operator=( ObjectRegistry const& ); - - ObjectRegistryData m_data; -}; - -} // namespace detail - -/** Helper class which indicates leaking object(s) of a particular class in - non-pro builds; use e.g. - - <pre> - class MyClass : private osl::DebugBase<MyClass> {...}; - </pre> - - Using the environment variable - - OSL_DEBUGBASE_STORE_ADDRESSES=MyClass;YourClass;... - - you can specify a ';'-separated list of strings matching to class names - (or "all" for all classes), for which DebugBase stores addresses to created - objects instead of just counting them. This enables you to iterate over - leaking objects in your debugger. - - @tpl InheritingClassT binds the template instance to that class - @internal Use at own risk. - For now this is just public (yet unpublished) API and may change - in the future! -*/ -template <typename InheritingClassT> -class DebugBase -{ -public: -#if OSL_DEBUG_LEVEL <= 0 - static bool checkObjectCount( ::std::size_t = 0 ) { return true; } -#else // OSL_DEBUG_LEVEL > 0 - /** @return whether the expected number of objects is alive, - else this function OSL_ASSERTs - */ - static bool checkObjectCount( ::std::size_t nExpected = 0 ) { - return StaticObjectRegistry::get().checkObjectCount(nExpected); - } - -protected: - DebugBase() { - StaticObjectRegistry::get().registerObject( this ); - } - ~DebugBase() { - StaticObjectRegistry::get().revokeObject( this ); - } - -private: - struct StaticObjectRegistry - : ::rtl::Static<detail::ObjectRegistry<InheritingClassT>, - StaticObjectRegistry> {}; -#endif -}; - -} // namespace osl - -#endif // ! defined(OSL_DIAGNOSE_HXX_INCLUDED) - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |