summaryrefslogtreecommitdiff
path: root/framework/inc/threadhelp/transactionguard.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/inc/threadhelp/transactionguard.hxx')
-rw-r--r--framework/inc/threadhelp/transactionguard.hxx188
1 files changed, 188 insertions, 0 deletions
diff --git a/framework/inc/threadhelp/transactionguard.hxx b/framework/inc/threadhelp/transactionguard.hxx
new file mode 100644
index 000000000000..e116cf8a2185
--- /dev/null
+++ b/framework/inc/threadhelp/transactionguard.hxx
@@ -0,0 +1,188 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
+#define __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#include <threadhelp/inoncopyable.h>
+#include <threadhelp/itransactionmanager.h>
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// other includes
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+//_________________________________________________________________________________________________________________
+// const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// declarations
+//_________________________________________________________________________________________________________________
+
+/*-************************************************************************************************************//**
+ @short implement a guard to support non breakable transactions
+ @descr If you whish to support non breakable method calls without lockingf any mutex, rw-lock or
+ something like that - you should use this guard implementation.
+ Initialize it at first in your method and don't release it till end of your function!
+ Your "transaction" is registered in ctor and automaticly released in dtor.
+ Use set/get of working mode to enable/disable further transactions.
+ It's possible too, to enable automaticly throwing of some exceptions for illegal
+ transaction requests ... e.g. interface call for already disposed objects.
+
+ @attention To prevent us against wrong using, the default ctor, copy ctor and the =operator are maked private!
+
+ @implements -
+ @base INonCopyable
+
+ @devstatus draft
+*//*-*************************************************************************************************************/
+class TransactionGuard : private INonCopyable
+{
+ //-------------------------------------------------------------------------------------------------------------
+ // public methods
+ //-------------------------------------------------------------------------------------------------------------
+ public:
+
+ /*-****************************************************************************************************//**
+ @short ctors
+ @descr Use these ctor methods to initialize the guard right.
+ Given reference must be valid - otherwise crashes could occure!
+
+ @attention It's not neccessary to lock any mutex here! Because a ctor should not be called
+ from different threads at the same time ... this class use no refcount mechanism!
+
+ @seealso -
+
+ @param "rManager" reference to transaction manager for using to register a request
+ @param "eMode" enable/disable throwing of exceptions for rejected calls
+ @param "eReason" returns reason for rejected calls if "eMode=E_NOEXCEPTIONS"!
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+ inline TransactionGuard( ITransactionManager& rManager, EExceptionMode eMode, ERejectReason* eReason = NULL )
+ : m_pManager( &rManager )
+ {
+ // If exception mode is set to E_HARDEXCETIONS we don't need a buffer to return reason!
+ // We handle it private. If a call is rejected, our manager throw some exceptions ... and the reason
+ // could be ignorable ...
+ if( eReason == NULL )
+ {
+ ERejectReason eMyReason;
+ m_pManager->registerTransaction( eMode, eMyReason );
+ }
+ else
+ {
+ m_pManager->registerTransaction( eMode, *eReason );
+ }
+ }
+
+ /*-************************************************************************************************************//**
+ @short dtor
+ @descr We must release the transaction manager and can forget his pointer.
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*************************************************************************************************************/
+ inline ~TransactionGuard()
+ {
+ stop();
+ }
+
+ /*-************************************************************************************************************//**
+ @short stop current transaction
+ @descr We must release the transaction manager and can forget his pointer.
+
+ @attention We don't support any start() method here - because it is not easy to
+ detect if a transaction already started or not!
+ (combination of EExceptionMode and ERejectReason)
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*************************************************************************************************************/
+ inline void stop()
+ {
+ if( m_pManager != NULL )
+ {
+ m_pManager->unregisterTransaction();
+ m_pManager = NULL;
+ }
+ }
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private methods
+ //-------------------------------------------------------------------------------------------------------------
+ private:
+
+ /*-****************************************************************************************************//**
+ @short disable using of these functions!
+ @descr It's not allowed to use this methods. Different problem can occure otherwise.
+ Thats why we disable it by make it private.
+
+ @seealso other ctor
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+ TransactionGuard();
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private member
+ //-------------------------------------------------------------------------------------------------------------
+ private:
+
+ ITransactionManager* m_pManager ; /// pointer to safed transaction manager
+
+}; // class TransactionGuard
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_