// main thread bool wesnothd_connection::receive_data(config& result) { MPTEST_LOG; { std::lock_guard<std::mutex> lock(recv_queue_mutex_); if(!recv_queue_.empty()) { result.swap(recv_queue_.front()); recv_queue_.pop_front(); return true; } } { std::lock_guard<std::mutex> lock(last_error_mutex_); if(last_error_) { std::string user_msg; if(last_error_ == boost::asio::error::eof) { user_msg = _("Disconnected from server."); } throw error(last_error_, user_msg); } } return false; }
TCPsocket get_received_data(TCPsocket sock, config& cfg, network::bandwidth_in_ptr& bandwidth_in) { assert(!raw_data_only); const threading::lock lock_received(*received_mutex); received_queue::iterator itor = received_data_queue.begin(); if(sock != nullptr) { for(; itor != received_data_queue.end(); ++itor) { if((*itor)->sock == sock) { break; } } } if(itor == received_data_queue.end()) { return nullptr; } else if (!(*itor)->config_error.empty()){ // throw the error in parent thread std::string error = (*itor)->config_error; buffer* buf = *itor; TCPsocket err_sock = (*itor)->sock; received_data_queue.erase(itor); delete buf; throw config::error(error) << network::tcpsocket_info(err_sock); } else { cfg.swap((*itor)->config_buf); const TCPsocket res = (*itor)->sock; buffer* buf = *itor; bandwidth_in.reset(new network::bandwidth_in((*itor)->raw_buffer.size())); received_data_queue.erase(itor); delete buf; return res; } }
static bool read_config(config& src, config& dst) { assert(dst.empty()); if(!src.empty()) { src.swap(dst); return true; } else { return false; } }
// main thread bool wesnothd_connection::receive_data(config& result) { MPTEST_LOG; { std::lock_guard<std::mutex> lock(recv_queue_mutex_); if(!recv_queue_.empty()) { result.swap(recv_queue_.front()); recv_queue_.pop_front(); return true; } } { std::lock_guard<std::mutex> lock(last_error_mutex_); if(last_error_) { throw error(last_error_); } } return false; }