Boost logo

Boost :

Subject: [boost] [transact] transaction language macros (was: Re: [transact] code in sandbox)
From: strasser_at_[hidden]
Date: 2010-02-19 10:07:12


here's my implementation of the macros for discussion:

https://svn.boost.org/trac/boost/changeset/59760

below are some example use cases. the (unachievable) ideal syntax would be

transaction{
   //...
}

for each case.
actual syntax:

begin_transaction{
   //...
}end_transaction;

in user loops with support for control statements:

for(...){
   begin_transaction{
     if(something) break;
   }end_transaction_in_loop;
}

the non-loop variant can be used in user loops if there are no control
statements used.

user code on retry, for example, limiting the number of retries to 5:

int retries=0;
begin_transaction{
   //...
}retry{
   if(retries++ == 5) break;
}end_retry;

the same in a user loop:

for(...){
   begin_transaction{
     if(something) break;
   }retry{
     ...
   }end_retry_in_loop;
}

the same can be used for the (RM-specific) case we've discussed before
to increase transaction priority on retry:

int priority=0;
begin_transaction{
   stm::set_priority(priority);
   //...
}retry{
   ++priority;
}end_retry;

stm::set_priority() can use transaction_manager::active_transaction()
to obtain the transaction.

rolling back a transaction on exception:

try{
   begin_transaction{
     //...
     throw my_exc();
     //...
   }end_transaction;
}catch(my_exc &){
   //transaction is rolled back
}

committing the transaction in case of a specific exception:

begin_transaction{
   try{
     //...
     throw my_exc();
     //...
   }catch(my_exc &){
     //tx will commit if my_exc is not rethrown
   }
}end_transaction;

invalid use cases:

using in_loop outside of user loops:

begin_transaction{

}end_transaction_in_loop; //compiler error: illegal "break"

using control statements without in_loop:

for(...){
   begin_transaction{
     if(something) break;
   }end_transaction; //error
}

this raises a runtime assertion if something==true.
ideal would be a compiler error, but I don't think that is possible.

are there any additional use cases to consider?
comments on syntax?

regards,

Stefan


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk