// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information. #ifndef INCLUDED_LIBGRAS_ELEMENT_IMPL_HPP #define INCLUDED_LIBGRAS_ELEMENT_IMPL_HPP #include #include #include #include #include #include #include #include #include namespace gras { struct ElementImpl { //deconstructor stuff ~ElementImpl(void); void top_block_cleanup(void); void hier_block_cleanup(void); void block_cleanup(void); //element identification std::string name; std::string repr; boost::shared_ptr uid; boost::shared_ptr weak_self; //top block stuff SharedThreadGroup thread_group; Token token; GlobalBlockConfig top_config; //element tree stuff Element parent; std::map children; //things may be in this element boost::shared_ptr topology; boost::shared_ptr executor; boost::shared_ptr block; boost::shared_ptr block_data; ThreadPool thread_pool; Apology::Base *get_elem(void) const { if (block) return block.get(); return topology.get(); } template void bcast_prio_msg(const MessageType &msg) { Theron::Receiver receiver; BOOST_FOREACH(Apology::Worker *worker, this->executor->get_workers()) { MessageType message = msg; message.prio_token = dynamic_cast(worker)->prio_token; worker->GetFramework().Send(message, receiver.GetAddress(), worker->GetAddress()); } size_t outstandingCount(this->executor->get_workers().size()); while (outstandingCount != 0) { outstandingCount -= receiver.Wait(outstandingCount); } } }; } //namespace gras #endif /*INCLUDED_LIBGRAS_ELEMENT_IMPL_HPP*/