t_instance_outcome cInstanceObject::TryToBecomeInstance(int inst) { // test instance, tries to become it _info("Trying instance inst="<<inst); const std::string igrp_name = std::string("instancegroup_") + m_program_name // testprogram + ( (m_range==e_range_user) ? ("_user_n_"+cMyNamedMutex::EscapeMutexNameWithLen(GetUserName())) : ( "_user_ANY" ) ) // testprogram_alice testprogram + ( (m_range==e_range_maindir) ? ("_dir_n_"+cMyNamedMutex::EscapeMutexNameWithLen(GetDirName())) : ( "_dir_ANY" ) ) ; _info("igrp_name=" << igrp_name); boost::interprocess::permissions mutex_curr_perms; if (m_range==e_range_system) mutex_curr_perms.set_unrestricted(); // others users on same system need to synchronize with this std::ostringstream mutex_name_str; mutex_name_str << igrp_name << "_instM" << inst; std::string mutex_name = mutex_name_str.str(); // mutex_name="name1foo1"; _info("Will try to become instance as mutex_name="<<mutex_name); m_curr_mutex.reset( new cMyNamedMutex ( boost::interprocess::open_or_create, mutex_name.c_str(), mutex_curr_perms ) ); // we created this mutex or it existed bool curr_locked = m_curr_mutex->try_lock_msg(str_to_vec("La"));// GetProcessIdentification() ) ); if (curr_locked) { // we locked it! _info("WE BECOME INSTANCE: Created and locked the Mc - we became the instance at inst="<<inst); m_curr_mutex->SetOwnership(true); // I own this mutex e.g. M5 // I am probably the leader // ... TODO ... ping all lower numbers are they responding after all to ping ... _info("I will start responding to pings (curr)"); m_pingable_curr.reset(new cInstancePingable( mutex_name, mutex_curr_perms )); // start responding to ping m_pingable_curr->Run(); return e_instance_i_won; // we created and locked (or just locked - reclaimed) an instance } _info("Can not create/lock the Mc so we lost or it is dead. inst="<<inst); bool other_is_alive = PingInstance(mutex_name, mutex_curr_perms); if (! other_is_alive) { _info("The other instance is dead!"); return e_instance_seems_dead; } return e_instance_i_lost; }
World::World(const std::string& file_path) { setup_engine(); // Open the file std::fstream fin(file_path); std::string command; // Insert all of the entities we will need. entities.insert(std::make_pair("player", std::vector<Entity*>())); entities.insert(std::make_pair("map", std::vector<Entity*>())); entities.insert(std::make_pair("zombie", std::vector<Entity*>())); entities.insert(std::make_pair("item", std::vector<Entity*>())); // Iterate over each line in the file. std::cout << "* Constructing World" << std::endl; while (std::getline(fin, command)) { // Create a vector to store the tokens, and convert the line to a string stream. std::vector<std::string> tokens; str_to_vec(command, tokens); if (tokens.size() == 4) { std::cout << " -> Entity - Type: " << tokens[0] << " File: " << tokens[1] << " Position: " << tokens[2] << " Rotation: " << tokens[3] << std::endl; // Construct the entity, and create position and rotation values. irr::core::vector3df position(str_to_vec3df(tokens[2])); irr::core::vector3df rotation(str_to_vec3df(tokens[3])); std::string path = "../Data/data/"; path += tokens[1] + ".txt"; // Simple dispatcher for each of the valid types. if (tokens[0] == "player") entities["player"].push_back(new Player(this, path, position, rotation)); else if (tokens[0] == "item") entities["item"].push_back(new Item(this, path, position, rotation)); else if (tokens[0] == "map") entities["map"].push_back(new Map(this, path, position, rotation)); else if (tokens[0] == "zombie") entities["zombie"].push_back(new Zombie(this, path, position, rotation)); } else { std::cout << " -> Entity - Malformed command, ignoring" << std::endl; } } std::cout << "* Constructing World Finished" << std::endl; }