transaction_::transaction_() : impl_(current_transaction()) { if (impl_ == NULL) { if (transaction_impl::part == nullptr) transaction_impl::part = new partition; #if !defined(SODIUM_SINGLE_THREADED) transaction_impl::part->mx.lock(); #endif if (!transaction_impl::part->processing_on_start_hooks) { transaction_impl::part->processing_on_start_hooks = true; try { if (!transaction_impl::part->shutting_down) { for (auto it = transaction_impl::part->on_start_hooks.begin(); it != transaction_impl::part->on_start_hooks.end(); ++it) (*it)(); } transaction_impl::part->processing_on_start_hooks = false; } catch (...) { transaction_impl::part->processing_on_start_hooks = false; throw; } } impl_ = new transaction_impl; #if !defined(SODIUM_SINGLE_THREADED) && defined(SODIUM_USE_PTHREAD_SPECIFIC) pthread_setspecific(current_transaction_key, impl_); #else global_current_transaction = impl_; #endif } transaction_impl::part->depth++; }
void execute () { try { sock_.join (addr_); auto_ptr<LinkListener> ll (new LinkListener (sock_, in_link_data_)); { AutoLock lock (mutex_); // Loop // // while (true) { cond_.wait (&sync_schedule); // "Loop of Fairness" bool done = false; do { // control message // // if (!in_control_.empty ()) { done = true; break; } // outsync // // if (sync_schedule < ACE_OS::gettimeofday ()) { // OUTSYNC outsync (); // schedule next outsync sync_schedule = ACE_OS::gettimeofday () + ACE_Time_Value (0, Protocol::SYNC_PERIOD); } // link message // // if (!in_link_data_.empty ()) { MessagePtr m (in_link_data_.front ()); in_link_data_.pop (); std::type_info const* exp = &typeid (*m); if (exp == typeid (LinkFailure)) { // cerr << "link failure" << endl; throw false; } else if (exp == typeid (LinkData)) { LinkData* data = dynamic_cast<LinkData*> (m.get ()); // INSYNC, TL, CT // Filter out loopback. // if (ACE_OS::strcmp (data->header().member_id.id, id_) != 0) { insync (); transaction_list (); current_transaction (data->header().current, data->payload (), data->size ()); } } else { // cerr << "unknown message type from link listener: " // << typeid (*m).name () << endl; ACE_OS::abort (); } } // api message // // if (!in_data_.empty ()) { // API api (); } } while (!in_link_data_.empty() || sync_schedule < ACE_OS::gettimeofday ()); if (done) break; } } } catch (...) { // cerr << "Exception in scheduler loop." << endl; MessageQueueAutoLock lock (out_control_); out_control_.push (MessagePtr (new Failure)); } }