From 1268326e814837e111eaf320f72661f288393839 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Tue, 16 Apr 2013 15:34:41 +0200 Subject: Further clean-up related to removed library unloading feature Change-Id: I1ec2aa4d0ed0940e7c0a26a18c78f2df4693d278 --- cppuhelper/inc/cppuhelper/factory.hxx | 12 ++-- cppuhelper/inc/cppuhelper/implementationentry.hxx | 7 ++- cppuhelper/source/factory.cxx | 57 +++-------------- sal/inc/rtl/unload.h | 66 +++++++------------- sal/osl/all/compat.cxx | 25 ++++---- sal/rtl/unload.cxx | 76 +++-------------------- udkapi/com/sun/star/uno/XUnloadingPreference.idl | 26 +------- 7 files changed, 65 insertions(+), 204 deletions(-) diff --git a/cppuhelper/inc/cppuhelper/factory.hxx b/cppuhelper/inc/cppuhelper/factory.hxx index 0c4f7665ce3f..8dfda840d51c 100644 --- a/cppuhelper/inc/cppuhelper/factory.hxx +++ b/cppuhelper/inc/cppuhelper/factory.hxx @@ -133,7 +133,8 @@ typedef ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >( @param fptr function pointer for instanciating the object @param rImplementationName implementation name of service @param rServiceNames supported services - @param pModCount for future extension (library unloading concept). + @param pModCount a backwards-compatibility remainder of a removed library + unloading feature; always set to null */ CPPUHELPER_DLLPUBLIC ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleComponentFactory > SAL_CALL createSingleComponentFactory( @@ -148,7 +149,8 @@ SAL_CALL createSingleComponentFactory( @param fptr function pointer for instanciating the object @param rImplementationName implementation name of service @param rServiceNames supported services - @param pModCount for future extension (library unloading concept). + @param pModCount a backwards-compatibility remainder of a removed library + unloading feature; always set to null @see createSingleComponentFactory */ @@ -175,7 +177,8 @@ typedef ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(SA @param rImplementationName the implementation name. An empty string is possible. @param pCreateFunction the function pointer to create an object. @param rServiceNames the service supported by the implementation. - @param pModCount for future extension (library unloading concept). + @param pModCount a backwards-compatibility remainder of a removed library + unloading feature; always set to null. @return a factory that support the interfaces XServiceProvider, XServiceInfo XSingleServiceFactory and XComponent. @@ -217,7 +220,8 @@ createFactoryProxy( @param rComponentName the implementation name. An empty string is possible. @param pCreateFunction the function pointer to create an object. @param rServiceNames the service supported by the implementation. - @param pModCount for future extension (library unloading concept). + @param pModCount a backwards-compatibility remainder of a removed library + unloading feature; always set to null. @return a factory that support the interfaces XServiceProvider, XServiceInfo XSingleServiceFactory and XComponent. diff --git a/cppuhelper/inc/cppuhelper/implementationentry.hxx b/cppuhelper/inc/cppuhelper/implementationentry.hxx index f8d8f936f174..298c0dc9e9ba 100644 --- a/cppuhelper/inc/cppuhelper/implementationentry.hxx +++ b/cppuhelper/inc/cppuhelper/implementationentry.hxx @@ -54,6 +54,9 @@ struct ImplementationEntry com::sun::star::uno::Sequence< rtl::OUString > MY_FN_PTR( getSupportedServiceNames ) (); /** Function that creates a SingleComponentFactory. + + The pModCount parameter is a backwards-compatibility remainder of a + removed library unloading feature; always set to null. */ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleComponentFactory > MY_FN_PTR( createFactory )( @@ -62,8 +65,8 @@ struct ImplementationEntry ::com::sun::star::uno::Sequence< ::rtl::OUString > const & rServiceNames, rtl_ModuleCount * pModCount ); - /** The shared-library module-counter of the implementation. Maybe 0. The module-counter - is used during by the createFactory()-function. + /** Backwards-compatibility remainder of a removed library unloading + feature; always set to null. */ rtl_ModuleCount * moduleCounter; diff --git a/cppuhelper/source/factory.cxx b/cppuhelper/source/factory.cxx index dc5cf91a0fee..160a17ace576 100644 --- a/cppuhelper/source/factory.cxx +++ b/cppuhelper/source/factory.cxx @@ -280,49 +280,9 @@ public: : OComponentHelper( aMutex ) , OSingleFactoryHelper( rServiceManager, rImplementationName_, pCreateFunction_, fptr, pServiceNames_ ) , bOneInstance( bOneInstance_ ) - , pModuleCount(0) { } - // Used by the createXXXFactory functions. The argument pModCount is used to prevent the unloading of the module - // which contains pCreateFunction_ - OFactoryComponentHelper( - const Reference & rServiceManager, - const OUString & rImplementationName_, - ComponentInstantiation pCreateFunction_, - ComponentFactoryFunc fptr, - const Sequence< OUString > * pServiceNames_, - rtl_ModuleCount * pModCount, - sal_Bool bOneInstance_ = sal_False ) - SAL_THROW(()) - : OComponentHelper( aMutex ) - , OSingleFactoryHelper( rServiceManager, rImplementationName_, pCreateFunction_, fptr, pServiceNames_ ) - , bOneInstance( bOneInstance_ ) - , pModuleCount(pModCount) - { - if(pModuleCount) - pModuleCount->acquire( pModuleCount); - } - - // old function, only for backward compatibility - OFactoryComponentHelper( - const Reference & rServiceManager, - const OUString & rImplementationName_, - sal_Bool bOneInstance_ = sal_False ) - SAL_THROW(()) - : OComponentHelper( aMutex ) - , OSingleFactoryHelper( rServiceManager, rImplementationName_ ) - , bOneInstance( bOneInstance_ ) - , pModuleCount(0) - { - } - - ~OFactoryComponentHelper() - { - if(pModuleCount) - pModuleCount->release( pModuleCount); - } - // XInterface Any SAL_CALL queryInterface( const Type & rType ) throw(::com::sun::star::uno::RuntimeException); @@ -363,7 +323,6 @@ public: private: Reference xTheInstance; sal_Bool bOneInstance; - rtl_ModuleCount * pModuleCount; protected: // needed for implementing XUnloadingPreference in inheriting classes sal_Bool isOneInstance() {return bOneInstance;} @@ -1024,11 +983,11 @@ Reference SAL_CALL createSingleFactory( const OUString & rImplementationName, ComponentInstantiation pCreateFunction, const Sequence< OUString > & rServiceNames, - rtl_ModuleCount *pModCount ) + rtl_ModuleCount * ) SAL_THROW(()) { return new OFactoryComponentHelper( - rServiceManager, rImplementationName, pCreateFunction, 0, &rServiceNames, pModCount, sal_False ); + rServiceManager, rImplementationName, pCreateFunction, 0, &rServiceNames, sal_False ); } // global function @@ -1046,11 +1005,11 @@ Reference SAL_CALL createOneInstanceFactory( const OUString & rImplementationName, ComponentInstantiation pCreateFunction, const Sequence< OUString > & rServiceNames, - rtl_ModuleCount *pModCount ) + rtl_ModuleCount * ) SAL_THROW(()) { return new OFactoryComponentHelper( - rServiceManager, rImplementationName, pCreateFunction, 0, &rServiceNames, pModCount, sal_True ); + rServiceManager, rImplementationName, pCreateFunction, 0, &rServiceNames, sal_True ); } // global function @@ -1080,22 +1039,22 @@ Reference< lang::XSingleComponentFactory > SAL_CALL createSingleComponentFactory ComponentFactoryFunc fptr, OUString const & rImplementationName, Sequence< OUString > const & rServiceNames, - rtl_ModuleCount * pModCount) + rtl_ModuleCount *) SAL_THROW(()) { return new OFactoryComponentHelper( - Reference< XMultiServiceFactory >(), rImplementationName, 0, fptr, &rServiceNames, pModCount, sal_False ); + Reference< XMultiServiceFactory >(), rImplementationName, 0, fptr, &rServiceNames, sal_False ); } Reference< lang::XSingleComponentFactory > SAL_CALL createOneInstanceComponentFactory( ComponentFactoryFunc fptr, OUString const & rImplementationName, Sequence< OUString > const & rServiceNames, - rtl_ModuleCount * pModCount) + rtl_ModuleCount *) SAL_THROW(()) { return new OFactoryComponentHelper( - Reference< XMultiServiceFactory >(), rImplementationName, 0, fptr, &rServiceNames, pModCount, sal_True ); + Reference< XMultiServiceFactory >(), rImplementationName, 0, fptr, &rServiceNames, sal_True ); } } diff --git a/sal/inc/rtl/unload.h b/sal/inc/rtl/unload.h index 0bbc414e792d..118b5cce9127 100644 --- a/sal/inc/rtl/unload.h +++ b/sal/inc/rtl/unload.h @@ -22,46 +22,22 @@ #include "sal/config.h" #include "osl/interlck.h" -#include "osl/module.h" #include "osl/time.h" #include "sal/saldllapi.h" #include "sal/types.h" -/** C-interface for a module reference counting - */ +/** @file + Backwards-compatibility remainders of a removed library unloading feature. +*/ + #ifdef __cplusplus extern "C" { #endif -/** -Pointers to rtl_ModuleCount are passed as arguments to the default factory creator -functions: createSingleComponentFactory, createSingleFactory, -createOneInstanceFactory. -The factory implementation is calling rtl_ModuleCount.acquire when it is being -constructed and it is calling rtl_ModuleCount.release. The implementations of -acquire -and release should influence the return value of component_canUnload -in a way that it -returns sal_False after acquire has been called. That is the module will not be unloaded -once a default factory has been created. A call to release may cause -component_canUnload to return sal_False, but only if there are -no object alive which -originated from the module. These objects are factory instances and the service instances -which have been created by these factories. -

-It is not necessary to synchronize acquire and release as a whole. -Simply sychronize the -access to a counter variable, e.g. the rtl_moduleCount_release implementation: -

-extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount * that )
-{
-    rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that;
-    osl_atomic_increment( &pMod->counter);
-}
-
-The SAL library offers functions that can be used for acquire and release. See struct -_rtl_StandardModuleCount. +/** Backwards-compatibility remainder of a removed library unloading feature. + + @deprecated Do not use. */ typedef struct _rtl_ModuleCount { @@ -69,16 +45,16 @@ typedef struct _rtl_ModuleCount void ( SAL_CALL * release ) ( struct _rtl_ModuleCount * that ); }rtl_ModuleCount; +/** Backwards-compatibility remainder of a removed library unloading feature. + @deprecated Do not use. +*/ #define MODULE_COUNT_INIT \ { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload, 0, {0, 0}} -/** -This struct can be used to implement the unloading mechanism. To make a UNO library -unloadable create one global instance of this struct in the module. To initialize it one -uses the MODULE_COUNT_INIT macro. +/** Backwards-compatibility remainder of a removed library unloading feature. -
rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT
; + @deprecated Do not use. */ typedef struct _rtl_StandardModuleCount { @@ -88,22 +64,24 @@ typedef struct _rtl_StandardModuleCount TimeValue unusedSince; } rtl_StandardModuleCount; -/** Default implementation for rtl_ModuleCount.acquire. Use this function along with -rtl_StandardModuleCount. +/** Backwards-compatibility remainder of a removed library unloading feature. + + @deprecated Do not use. */ SAL_DLLPUBLIC void rtl_moduleCount_acquire(rtl_ModuleCount * that ); -/** Default implementation for rtl_ModuleCount.release. -Use this function along with -rtl_StandardModuleCount. + +/** Backwards-compatibility remainder of a removed library unloading feature. + + @deprecated Do not use. */ SAL_DLLPUBLIC void rtl_moduleCount_release( rtl_ModuleCount * that ); -/** Default implementation for component_canUnload. Use this function along with -rtl_StandardModuleCount. +/** Backwards-compatibility remainder of a removed library unloading feature. + + @deprecated Do not use. */ SAL_DLLPUBLIC sal_Bool rtl_moduleCount_canUnload( rtl_StandardModuleCount * that, TimeValue* libUnused); - #ifdef __cplusplus } #endif diff --git a/sal/osl/all/compat.cxx b/sal/osl/all/compat.cxx index 12f0da13fade..2f86771bb753 100644 --- a/sal/osl/all/compat.cxx +++ b/sal/osl/all/compat.cxx @@ -39,6 +39,12 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL osl_tryToAcquireSemaphore(void *) { for (;;) { std::abort(); } // avoid "must return a value" warnings } +SAL_DLLPUBLIC_EXPORT sal_Int32 SAL_CALL rtl_addUnloadingListener( + void (SAL_CALL *)(void *), void *) +{ + for (;;) { std::abort(); } // avoid "must return a value" warnings +} + SAL_DLLPUBLIC_EXPORT sal_Int32 SAL_CALL rtl_compareMemory( void const *, void const *, sal_Size) { @@ -67,33 +73,24 @@ SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_moveMemory( std::abort(); } -SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_zeroMemory(void *, sal_Size) { - std::abort(); -} - SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL rtl_registerModuleForUnloading(oslModule) { for (;;) { std::abort(); } // avoid "must return a value" warnings } -SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_unregisterModuleForUnloading(oslModule) -{ +SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_removeUnloadingListener(sal_Int32) { std::abort(); } -SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_unloadUnusedModules(TimeValue *) -{ +SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_unloadUnusedModules(TimeValue *) { std::abort(); } -typedef void (SAL_CALL *rtl_unloadingListenerFunc)(void *id); -SAL_DLLPUBLIC_EXPORT sal_Int32 SAL_CALL rtl_addUnloadingListener(rtl_unloadingListenerFunc, void *) -{ - for (;;) { std::abort(); } // avoid "must return a value" warnings +SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_unregisterModuleForUnloading(oslModule) { + std::abort(); } -SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_removeUnloadingListener(sal_Int32) -{ +SAL_DLLPUBLIC_EXPORT void SAL_CALL rtl_zeroMemory(void *, sal_Size) { std::abort(); } diff --git a/sal/rtl/unload.cxx b/sal/rtl/unload.cxx index dd8ee23b49bc..0b5bc2e79d27 100644 --- a/sal/rtl/unload.cxx +++ b/sal/rtl/unload.cxx @@ -17,79 +17,19 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include +#include "sal/config.h" -#include -#include -#include +#include "osl/time.h" +#include "rtl/unload.h" -using osl::MutexGuard; +extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount *) {} -//---------------------------------------------------------------------------- +extern "C" void rtl_moduleCount_release(rtl_ModuleCount *) {} -#ifndef DISABLE_DYNLOADING - -namespace -{ - class theUnloadingMutex : public rtl::Static{}; -} - -static osl::Mutex& getUnloadingMutex() -{ - return theUnloadingMutex::get(); -} - -#endif - -extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount * that ) -{ -#ifdef DISABLE_DYNLOADING - (void) that; -#else - rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that; - osl_atomic_increment( &pMod->counter); -#endif -} - -extern "C" void rtl_moduleCount_release( rtl_ModuleCount * that ) -{ -#ifdef DISABLE_DYNLOADING - (void) that; -#else - rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that; - OSL_ENSURE( pMod->counter >0 , "library counter incorrect" ); - osl_atomic_decrement( &pMod->counter); - if( pMod->counter == 0) - { - MutexGuard guard( getUnloadingMutex()); - - if( sal_False == osl_getSystemTime( &pMod->unusedSince) ) - { - // set the time to 0 if we could not get the time - pMod->unusedSince.Seconds= 0; - pMod->unusedSince.Nanosec= 0; - } - } -#endif -} - -extern "C" sal_Bool rtl_moduleCount_canUnload( rtl_StandardModuleCount * that, TimeValue * libUnused) +extern "C" sal_Bool rtl_moduleCount_canUnload( + rtl_StandardModuleCount *, TimeValue *) { -#ifdef DISABLE_DYNLOADING - (void) that; - (void) libUnused; - return sal_False; -#else - if (that->counter == 0) - { - MutexGuard guard( getUnloadingMutex()); - if (libUnused && (that->counter == 0)) - { - memcpy(libUnused, &that->unusedSince, sizeof(TimeValue)); - } - } - return (that->counter == 0); -#endif + return false; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/udkapi/com/sun/star/uno/XUnloadingPreference.idl b/udkapi/com/sun/star/uno/XUnloadingPreference.idl index 25c99e0aea80..28dbea1fcbf9 100644 --- a/udkapi/com/sun/star/uno/XUnloadingPreference.idl +++ b/udkapi/com/sun/star/uno/XUnloadingPreference.idl @@ -24,32 +24,12 @@ module com { module sun { module star { module uno { -/** Components can implement XUnloadingPreference in order to indicate - how they should be treated when their hosting library is to be unloaded. - - When someone calls rtl_unloadUnusedModules then the unloading - listeners are notified by calling previously registered callback - functions. A listener is an entity that employs, registers, and - unregisters the callback functions on its behalf. Upon notification - (the callback function is being called) - a listener may release references to UNO components. Thus, the - loaded libraries can be unloaded, if no one else keeps any - objects from the library alive.
- Before a listener releases references, it should ask for this interface. - If the interface is not implemented, then the listener may release the - object; otherwise, it calls releaseOnNotification. If the function - returns false then the listener should keep the reference, otherwise - it may release it. +/** Backwards-compatibility remainder of a removed library unloading feature. + + @deprecated Do not use. */ published interface XUnloadingPreference: com::sun::star::uno::XInterface { - /** - The return value determines if the object wants to stay - alive in case of an unloading procedure. - @return - do not release references to this object,otherwise - - */ boolean releaseOnNotification(); }; -- cgit v1.2.3