void GraphTools::__BFS( std::queue< raft::kernel* > &queue, std::set< raft::kernel* > &visited_set, edge_func func, void *data, bool connected_error ) { while( queue.size() > 0 ) { auto *k( queue.front() ); queue.pop(); if( k == nullptr ) break; /** iterate over all out-edges **/ /** 1) get lock **/ while( ! k->output.portmap.mutex_map.try_lock() ) { std::this_thread::yield(); } //we have lock, continue /** 2) get map **/ std::map< std::string, PortInfo > &map_of_ports( k->output.portmap.map ); for( auto &port : map_of_ports ) { PortInfo &source( port.second ); /** get dst edge to call function on **/ if( source.other_kernel != nullptr ) { PortInfo &dst( source.other_kernel->input.getPortInfoFor( source.other_name ) ); func( source, dst, data ); } else if( connected_error ) { std::stringstream ss; ss << "Unconnected port detected at " << common::printClassName( *k ) << "[ \"" << source.my_name << " \"], please fix and recompile."; k->output.portmap.mutex_map.unlock(); throw PortException( ss.str() ); } /** if the dst kernel hasn't been visited, visit it **/ if( visited_set.find( source.other_kernel ) == visited_set.end() ) { queue.push( source.other_kernel ); visited_set.insert( source.other_kernel ); } } k->output.portmap.mutex_map.unlock(); } return; }
void GraphTools::__BFS( std::queue< raft::kernel* > &queue, std::set< raft::kernel* > &visited_set, vertex_func func, void *data ) { #if 0 while( queue.size() > 0 ) { auto *source( queue.front() ); queue.pop(); /** iterate over all out-edges **/ /** 1) get lock **/ std::lock_guard< std::mutex > lock( source->output.portmap.map_mutex ); /** 2) get map **/ std::map< std::string, PortInfo > &map_of_ports( source->output.portmap.map ); /** 3) visit kernel **/ func( *source, data ); /** 4) add children to queue **/ for( auto &port : map_of_ports ) { PortInfo &source( port.second ); /** get dst edge to call function on **/ if( source.other_kernel != nullptr ) { PortInfo &dst( source.other_kernel->input.getPortInfoFor( source.other_name ) ); func( source, dst, data ); } else if( connected_error ) { std::stringstream ss; ss << "Unconnected port detected at " << common::printClassName( *k ) << "[ \"" << source.my_name << " \"], please fix and recompile."; throw PortException( ss.str() ); } /** if the dst kernel hasn't been visited, visit it **/ if( visited_set.find( source.other_kernel ) == visited_set.end() ) { queue.push( source.other_kernel ); visited_set.insert( source.other_kernel ); } } } return; #endif assert( false ); /** FIXME: error above with virtual function 'func', fix in a bit **/ }
void GraphTools::__BFS( std::queue< raft::kernel* > &queue, std::set< raft::kernel* > &visited_set, vertex_func func, void *data ) { while( queue.size() > 0 ) { auto *source( queue.front() ); if( source == nullptr ) break; queue.pop(); /** iterate over all out-edges **/ /** 1) get lock **/ while( ! source->output.portmap.mutex_map.try_lock() ) { std::this_thread::yield(); } /** 2) get map **/ std::map< std::string, PortInfo > &map_of_ports( source->output.portmap.map ); /** 3) visit kernel **/ func( source, data ); /** 4) add children to queue **/ for( auto &port : map_of_ports ) { PortInfo &source( port.second ); /** get dst edge to call function on **/ if( source.other_kernel != nullptr ) { /** if the dst kernel hasn't been visited, visit it **/ if( visited_set.find( source.other_kernel ) == visited_set.end() ) { queue.push( source.other_kernel ); visited_set.insert( source.other_kernel ); } } } source->output.portmap.mutex_map.unlock(); } return; }