Boost logo

Boost :

Subject: Re: [boost] [transaction] New Boost.Transactionlibraryunderdiscussion
From: Stefan Strasser (strasser_at_[hidden])
Date: 2010-01-21 16:43:22


Am Thursday 21 January 2010 23:56:07 schrieb Vicente Botet Escriba:
> I understand the intent of lazy constructing the local transactions. IMO
> this lazy construction can be done, but as soon as a resource has already a
> transaction, any global nested transaction should create a local
> transaction on it. All the resources have the same nested level of
> transaction except those that have none.
> This should solve the preceding issue, and let STM check for rollback only
> as soon as possible.

ok, that STM can check on each access makes it even easier:
let's introduce a ResourceManager::check(transaction &) function, which is
called by the TransactionManager every time a transaction is created or
committed(or on every access?). then there is no need to create empty nested
transactions, is there?

this could even be exposed to the user as basic_transaction<>::check(), which
checks each resource, so he can do something like this:

transaction tx;

//modify res

tx.check();

//do something unrelated, non-transactional, that takes a while

//continue modifying res

> if (instance_==0) {
> scoped_lock<mutex> lk(mtx_);
> if (instance_==0) instance_ = new txmgr(...);
> } // here instance_!= 0

I used something like that in basic_transaction_manager::resource_transaction
before, but I believe this is invalid code.

what stops the compiler from inlining the txmgr constructor and decomposing it
into code like this?

if(instance_==0){
  scoped_lock<mutex> lk(mtx_);
  if(instance_==0){
    instance_=operator new(sizeof(txmgr));
    //construct the txmgr in instance_;
  }
}

> return *instance_;
> }
> static char *db_filename;
> ...
> };
> char * txmgr::db_filename="file.db";

I put that in main() because configuration options might be determined at
runtime. but ok, that might be quite rare.
I'd still prefer that it's the user's obligation to construct a transaction
manager, but maybe that's also just a difference in style.
what exactly is your issue with that? that the user could make a programming
error by omitting the construction?

>
> int main(){
> basic_transaction<txmgr> tx;
> ...
> tx.commit();
> }
>
> Can you found this code on your book? ;-)

no, not there :)


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