1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
25 #define __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
26 
27 //_________________________________________________________________________________________________________________
28 //	my own includes
29 //_________________________________________________________________________________________________________________
30 
31 #include <threadhelp/inoncopyable.h>
32 #include <threadhelp/itransactionmanager.h>
33 
34 //_________________________________________________________________________________________________________________
35 //	interface includes
36 //_________________________________________________________________________________________________________________
37 
38 //_________________________________________________________________________________________________________________
39 //	other includes
40 //_________________________________________________________________________________________________________________
41 
42 //_________________________________________________________________________________________________________________
43 //	namespace
44 //_________________________________________________________________________________________________________________
45 
46 namespace framework{
47 
48 //_________________________________________________________________________________________________________________
49 //	const
50 //_________________________________________________________________________________________________________________
51 
52 //_________________________________________________________________________________________________________________
53 //	declarations
54 //_________________________________________________________________________________________________________________
55 
56 /*-************************************************************************************************************//**
57     @short          implement a guard to support non breakable transactions
58     @descr          If you whish to support non breakable method calls without lockingf any mutex, rw-lock or
59                     something like that - you should use this guard implementation.
60                     Initialize it at first in your method and don't release it till end of your function!
61                     Your "transaction" is registered in ctor and automatically released in dtor.
62                     Use set/get of working mode to enable/disable further transactions.
63                     It's possible too, to enable automatically throwing of some exceptions for illegal
64                     transaction requests ... e.g. interface call for already disposed objects.
65 
66 	@attention		To prevent us against wrong using, the default ctor, copy ctor and the =operator are maked private!
67 
68 	@implements		-
69     @base           INonCopyable
70 
71     @devstatus      draft
72 *//*-*************************************************************************************************************/
73 class TransactionGuard : private INonCopyable
74 {
75 	//-------------------------------------------------------------------------------------------------------------
76 	//	public methods
77 	//-------------------------------------------------------------------------------------------------------------
78 	public:
79 
80         /*-****************************************************************************************************//**
81             @short      ctors
82             @descr      Use these ctor methods to initialize the guard right.
83                         Given reference must be valid - otherwise crashes could occur!
84 
85             @attention  It's not necessary to lock any mutex here! Because a ctor should not be called
86                         from different threads at the same time ... this class use no refcount mechanism!
87 
88             @seealso    -
89 
90             @param      "rManager"  reference to transaction manager for using to register a request
91             @param      "eMode"     enable/disable throwing of exceptions for rejected calls
92             @param      "eReason"   returns reason for rejected calls if "eMode=E_NOEXCEPTIONS"!
93             @return     -
94 
95             @onerror    -
96         *//*-*****************************************************************************************************/
97         inline TransactionGuard( ITransactionManager& rManager, EExceptionMode eMode, ERejectReason* eReason = NULL )
98             : m_pManager( &rManager )
99         {
100             // If exception mode is set to E_HARDEXCETIONS we don't need a buffer to return reason!
101             // We handle it private. If a call is rejected, our manager throw some exceptions ... and the reason
102             // could be ignorable ...
103             if( eReason == NULL )
104             {
105                 ERejectReason eMyReason;
106                 m_pManager->registerTransaction( eMode, eMyReason );
107             }
108             else
109             {
110                 m_pManager->registerTransaction( eMode, *eReason );
111             }
112         }
113 
114         /*-************************************************************************************************************//**
115             @short      dtor
116             @descr      We must release the transaction manager and can forget his pointer.
117 
118             @seealso    -
119 
120             @param      -
121             @return     -
122 
123             @onerror    -
124         *//*-*************************************************************************************************************/
125         inline ~TransactionGuard()
126         {
127             stop();
128         }
129 
130         /*-************************************************************************************************************//**
131             @short      stop current transaction
132             @descr      We must release the transaction manager and can forget his pointer.
133 
134             @attention  We don't support any start() method here - because it is not easy to
135                         detect if a transaction already started or not!
136                         (combination of EExceptionMode and ERejectReason)
137 
138             @seealso    -
139 
140             @param      -
141             @return     -
142 
143             @onerror    -
144         *//*-*************************************************************************************************************/
145         inline void stop()
146         {
147             if( m_pManager != NULL )
148             {
149                 m_pManager->unregisterTransaction();
150                 m_pManager = NULL;
151             }
152         }
153 
154 	//-------------------------------------------------------------------------------------------------------------
155 	//	private methods
156 	//-------------------------------------------------------------------------------------------------------------
157 	private:
158 
159 		/*-****************************************************************************************************//**
160 			@short		disable using of these functions!
161 			@descr		It's not allowed to use this methods. Different problems can occur otherwise.
162 						Thats why we disable it by make it private.
163 
164 			@seealso	other ctor
165 
166 			@param		-
167 			@return		-
168 
169 			@onerror	-
170 		*//*-*****************************************************************************************************/
171         TransactionGuard();
172 
173 	//-------------------------------------------------------------------------------------------------------------
174 	//	private member
175 	//-------------------------------------------------------------------------------------------------------------
176 	private:
177 
178         ITransactionManager*   m_pManager   ;   /// pointer to safed transaction manager
179 
180 };      //  class TransactionGuard
181 
182 }		//	namespace framework
183 
184 #endif  //  #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
185