// 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 #include namespace gras { struct ElementImpl { //setup stuff void setup_actor(void); //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 global_config; //element tree stuff Element parent; std::map children; Element *self; //things may be in this element boost::shared_ptr worker; boost::shared_ptr topology; boost::shared_ptr executor; boost::shared_ptr block_actor; boost::shared_ptr block_data; ThreadPool thread_pool; Apology::Base *get_elem(void) const { if (worker) return worker.get(); if (topology) return topology.get(); else throw std::runtime_error("ElementImpl::get_elem fail"); } template void bcast_prio_msg(const MessageType &msg) { Theron::Receiver receiver; BOOST_FOREACH(Apology::Worker *w, this->topology->get_workers()) { BlockActor *actor = dynamic_cast(w->get_actor()); MessageType message = msg; message.prio_token = actor->prio_token; actor->GetFramework().Send(message, receiver.GetAddress(), actor->GetAddress()); } size_t outstandingCount(this->topology->get_workers().size()); while (outstandingCount != 0) { outstandingCount -= receiver.Wait(outstandingCount); } } }; } //namespace gras #endif /*INCLUDED_LIBGRAS_ELEMENT_IMPL_HPP*/