$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [transact] transaction language macros (was: Re: [transact] code in sandbox)
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2010-02-21 19:02:05
Hi,
----- Original Message -----
From: <strasser_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Sunday, February 21, 2010 11:21 PM
Subject: Re: [boost] [transact] transaction language macros (was: Re: [transact] code in sandbox)
>
> the changes we've discussed:
>
> https://svn.boost.org/trac/boost/changeset/59827
I have used this enumeration
enum control_flow {
none,
break_,
continue_
};
I suggest you use the same to avoid code using constants as 0, 1,2.
> Zitat von "vicente.botet" <vicente.botet_at_[hidden]>:
>
>> Yes, we can. But the result of the break is that we don't retry,
>> i.e. we abort the transaction. If you prefer you can throw an
>> isolation_exception when the user uses break or continue instead of
>> asserting it don't use it.
>
> I'm pretty sure you're trying to stop the user from shooting himself
> in the foot here.
> instead of "break", the user could also "return" from a retry clause.
> or throw an exception and absorbing it outside of the transactino
> scope, with similar results.
> I think "break" should break, not assert and not throw, just because
> we think this is what the user should have done.
The difference is that the user would not write a retry block on a sequential program, retry is specific of transactions. As we are not used to work with retry, maybe the best is to allow it to choose if s/he prefer to let break/continue to be used, asserted or throw an isolation_exception. The default could be to exit the user loop. What do you think?
>>> try{
>>> //...
>>> }catch(my_exc &){
>>> transaction{
>>> //...
>>> }retry{
>>> throw;
>>> }
>>> }
>>>
>>> is it expected behaviour that this rethrows isolation_exception, not my_exc?
>>
>> yes, IMO the exception must be isolation_exception, or a specific
>> exception the library documents and make the outer transaction to
>> abort.
>
> OK. moved the user's retry code back into the catch-clause.
A minor detail to the new implementation. The body of a retry statement should IMO be a compound statement if we want follow the C++ catch grammar.
}catch(boost::transact::isolation_exception &___i){ \
___i.unwind<TXMGR>(); \
do{ \
___control=1; \
if(false);else
Instead of
if(false);else
you can do
try {throw;}catch (boost::transact::isolation_exception &)
I have a question related to unwind. Instead of
}catch(boost::transact::isolation_exception &___i){ \
___i.unwind<TXMGR>(); \
I have the equivalent of
} catch (boost::transact::isolation_exception &) { \
if (__tx.is_nested()) throw; \
is_nested returns true if the transaction is not a root tra,nsaction.
Does unwind do exactly the same? If this is not the case could you explain what unwind does?
Best,
Vicente