void YacasKernel::Request::reply(zmqpp::socket& socket, const std::string& msg_type, const Json::Value& content) const { Json::Value header; header["username"] = "******"; header["version"] = "5.0"; header["session"] = boost::uuids::to_string(_session.uuid()); header["date"] = now(); header["msg_id"] = boost::uuids::to_string(_session.generate_msg_uuid()); header["msg_type"] = msg_type; Json::StreamWriterBuilder builder; const std::string content_buf = Json::writeString(builder, content); // FIXME: const std::string metadata_buf = "{}"; const std::string header_buf = Json::writeString(builder, header); const std::string parent_header_buf = Json::writeString(builder, _header); HMAC_SHA256 auth(_session.auth()); auth.update(header_buf); auth.update(parent_header_buf); auth.update(metadata_buf); auth.update(content_buf); zmqpp::message msg; msg.add(_identities_buf); msg.add("<IDS|MSG>"); msg.add(auth.hexdigest()); msg.add(header_buf); msg.add(parent_header_buf); msg.add(metadata_buf); msg.add(content_buf); socket.send(msg); }
void regionDataPublisher(zmqpp::socket &publisher, PATH_FIND_NODE &pathFindNode, tbb::concurrent_queue<PathEntity*> &solvedPathQueue, tbb::concurrent_vector<Entity*> entities) { using namespace std; std::chrono::steady_clock clock; // Initialize path. for (auto entity : entities) { pathFindNode.try_put(std::tuple<size_t, glm::vec2>(entity->id, entity->position)); } while (1) { auto start = clock.now(); // Grab a bunch fo path { //size_t size = entities.size(); for (size_t i = 0; i < 200; ++i) { PathEntity* pathEntity; if (solvedPathQueue.try_pop(pathEntity)) { entities[pathEntity->id]->pathNodes = pathEntity->pathNodes; entities[pathEntity->id]->currentNode = 0; } } } // Traverse nodes { for (auto entity : entities) { if (entity->pathNodes != 0) { if (entity->currentNode < entity->pathNodes->size()) { size_t currentIndex = (size_t)(*entity->pathNodes)[entity->currentNode++]; //wss::Utils::indexToXY(currentIndex, MAP_W, entity->position); wss::Utils::indexToXY(currentIndex, MAP_W, entity->position); } else { entity->pathNodes = 0; pathFindNode.try_put(std::tuple<size_t, glm::vec2>(entity->id, entity->position)); } } } } { rapidjson::Document document; document.SetObject(); serializeEntities(document, 0, entities.size(), entities); rapidjson::StringBuffer sb; rapidjson::Writer<rapidjson::StringBuffer> writer(sb); document.Accept(writer); publisher.send(sb.GetString()); } std::chrono::duration<double> elapsed = clock.now() - start; if (elapsed.count() < 1.0/5.0) { std::this_thread::sleep_for(std::chrono::milliseconds(1000/5 - (size_t)(elapsed.count() * 1000.0))); //cout << "elpased region publisher" << endl; } } }