summaryrefslogtreecommitdiff
path: root/salhelper/inc/salhelper/singletonref.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'salhelper/inc/salhelper/singletonref.hxx')
-rw-r--r--salhelper/inc/salhelper/singletonref.hxx197
1 files changed, 0 insertions, 197 deletions
diff --git a/salhelper/inc/salhelper/singletonref.hxx b/salhelper/inc/salhelper/singletonref.hxx
deleted file mode 100644
index a602e50cc4bf..000000000000
--- a/salhelper/inc/salhelper/singletonref.hxx
+++ /dev/null
@@ -1,197 +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 _SALHELPER_SINGLETONREF_HXX_
-#define _SALHELPER_SINGLETONREF_HXX_
-
-#include <osl/mutex.hxx>
-#include "rtl/instance.hxx"
-#include "osl/diagnose.h"
-#include "osl/getglobalmutex.hxx"
-
-
-namespace salhelper{
-
-
-/** @short template for implementing singleton classes.
-
- Such classes can be instanciated everytimes they
- are needed. But the internal wrapped object will
- be created one times only. Of course its used
- resources are referenced one times only too.
- This template hold it alive till the last
- reference is gone. Further all operations
- on this reference are threadsafe. Only
- calls directly to the internal object (which modify
- its state) must be made threadsafe by the object itself
- or from outside.
-
- @attention To prevent the code against race conditions, its not
- allowed to start operations inside the ctor
- of the internal wrapped object - especialy operations
- which needs a reference to the same singleton too.
-
- The only chance to supress such strange constellations
- is a lazy-init mechanism.
-
- <ul>
- <li>a) The singleton class can provide a special init()
- method, which must be called as first after creation.</li>
- <li>b) The singleton class can call a special impl_init()
- method implicit for every called interface method.</li>
- </ul>
-
- Note further that this singleton pattern can work only, if
- all user of such singleton are located inside the same library!
- Because static values cant be exported - e.g. from windows libraries.
- */
-template< class SingletonClass >
-class SingletonRef
-{
- //-------------------------------------------
- // member
-
- private :
-
- /** @short pointer to the internal wrapped singleton. */
- static SingletonClass* m_pInstance;
-
- /** @short ref count, which regulate creation and removing of m_pInstance. */
- static sal_Int32 m_nRef;
-
- //-------------------------------------------
- // interface
-
- public :
-
- //---------------------------------------
-
- /** @short standard ctor.
-
- The internal wrapped object is created only,
- if its ref count was 0. Otherwhise this method
- does nothing ... except increasing of the internal
- ref count!
- */
- SingletonRef()
- {
- // GLOBAL SAFE ->
- ::osl::MutexGuard aLock(SingletonRef::ownStaticLock());
-
- // must be increased before(!) the check is done.
- // Otherwhise this check can fail inside the same thread ...
- ++m_nRef;
- if (m_nRef == 1)
- m_pInstance = new SingletonClass();
-
- OSL_ENSURE(m_nRef>0 && m_pInstance, "Race? Ref count of singleton >0, but instance is NULL!");
- // <- GLOBAL SAFE
- }
-
- //---------------------------------------
-
- /** @short standard dtor.
-
- The internal wrapped object is removed only,
- if its ref count wil be 0. Otherwhise this method
- does nothing ... except decreasing of the internal
- ref count!
- */
- ~SingletonRef()
- {
- // GLOBAL SAFE ->
- ::osl::MutexGuard aLock(SingletonRef::ownStaticLock());
-
- // must be decreased before(!) the check is done.
- // Otherwhise this check can fail inside the same thread ...
- --m_nRef;
- if (m_nRef == 0)
- {
- delete m_pInstance;
- m_pInstance = 0;
- }
- // <- GLOBAL SAFE
- }
-
- //---------------------------------------
-
- /** @short Allows rSingle->someBodyOp().
- */
- SingletonClass* operator->() const
- {
- // GLOBAL SAFE ->
- ::osl::MutexGuard aLock(SingletonRef::ownStaticLock());
- return m_pInstance;
- // <- GLOBAL SAFE
- }
-
- //---------------------------------------
-
- /** @short Allows (*rSingle).someBodyOp().
- */
- SingletonClass& operator*() const
- {
- // GLOBAL SAFE ->
- ::osl::MutexGuard aLock(SingletonRef::ownStaticLock());
- return *m_pInstance;
- // <- GLOBAL SAFE
- }
-
- //-------------------------------------------
- // helper
-
- private :
-
- //---------------------------------------
-
- /** @short creates an own mutex for guarding static contents.
-
- The global mutex the osl library is used one times
- only to create an own static mutex, which can be used
- next time to guard own static member operations.
- */
- struct SingletonLockInit
- {
- ::osl::Mutex* operator()()
- {
- static ::osl::Mutex aInstance;
- return &aInstance;
- }
- };
-
- ::osl::Mutex& ownStaticLock() const
- {
- return *rtl_Instance< ::osl::Mutex,
- SingletonLockInit,
- ::osl::MutexGuard,
- ::osl::GetGlobalMutex >::create(SingletonLockInit(), ::osl::GetGlobalMutex());
- }
-};
-
-template< class SingletonClass >
-SingletonClass* SingletonRef< SingletonClass >::m_pInstance = 0;
-
-template< class SingletonClass >
-sal_Int32 SingletonRef< SingletonClass >::m_nRef = 0;
-
-} // namespace salhelper
-
-#endif // _SALHELPER_SINGLETONREF_HXX_
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */