diff options
Diffstat (limited to 'sal/inc/osl/diagnose.hxx')
-rw-r--r-- | sal/inc/osl/diagnose.hxx | 209 |
1 files changed, 0 insertions, 209 deletions
diff --git a/sal/inc/osl/diagnose.hxx b/sal/inc/osl/diagnose.hxx deleted file mode 100644 index bbf1fa7231c4..000000000000 --- a/sal/inc/osl/diagnose.hxx +++ /dev/null @@ -1,209 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ -#ifndef OSL_DIAGNOSE_HXX_INCLUDED -#define OSL_DIAGNOSE_HXX_INCLUDED - -#include "sal/config.h" - -#include <functional> -#include <typeinfo> - -#ifndef HAVE_CXX0X -#define BOOST_NO_0X_HDR_TYPEINDEX -#endif -#include "boost/unordered_set.hpp" -#include "osl/diagnose.h" -#include "osl/interlck.h" -#include "osl/mutex.hxx" -#include "rtl/allocator.hxx" -#include "rtl/instance.hxx" -#include "sal/log.hxx" -#include "sal/saldllapi.h" -#include "sal/types.h" - -/// @cond INTERNAL - -namespace osl { -namespace detail { - -struct ObjectRegistryData; - -} // namespace detail -} // namespace osl - -extern "C" { - -SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses( - char const* pName ) - SAL_THROW_EXTERN_C(); - -SAL_DLLPUBLIC bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount( - ::osl::detail::ObjectRegistryData const& rData, ::std::size_t nExpected ) - SAL_THROW_EXTERN_C(); - -SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_registerObject( - ::osl::detail::ObjectRegistryData & rData, void const* pObj ) - SAL_THROW_EXTERN_C(); - -SAL_DLLPUBLIC void SAL_CALL osl_detail_ObjectRegistry_revokeObject( - ::osl::detail::ObjectRegistryData & rData, void const* pObj ) - SAL_THROW_EXTERN_C(); - -// These functions presumably should not be extern "C", but changing -// that would break binary compatibility. -#ifdef __clang__ -#pragma clang diagnostic push -// Guard against slightly older clang versions that don't have -// -Wreturn-type-c-linkage... -#pragma clang diagnostic ignored "-Wunknown-pragmas" -#pragma clang diagnostic ignored "-Wreturn-type-c-linkage" -#endif - -SAL_DLLPUBLIC ::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex() - SAL_THROW_EXTERN_C(); - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -} // extern "C" - -namespace osl { - -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 ) { - SAL_WARN_IF( *iPos == 0, "sal.debug", "null pointer" ); - } - } - 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. - - @tparam InheritingClassT binds the template instance to that class - @attention 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 SAL_WARNs - */ - 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 - -/// @endcond - -#endif // ! defined(OSL_DIAGNOSE_HXX_INCLUDED) - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |