Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <thread>
- #include <condition_variable>
- #include "AirportServer.h"
- /**
- * Called by an Airplane when it wishes to land on a runway
- */
- void AirportServer::reserveRunway(int airplaneNum, AirportRunways::RunwayNumber runway)
- {
- // Acquire runway(s)
- { // Begin critical region
- //unique_lock<mutex> runwaysLock(runwaysMutex);
- {
- lock_guard<mutex> lk(AirportRunways::checkMutex);
- cout << "Airplane #" << airplaneNum << " is acquiring any needed runway(s) for landing on Runway "
- << AirportRunways::runwayName(runway) << endl;
- }
- /**
- * ***** Add your synchronization here! *****
- */
- muticee[runway].lock();
- switch (runway) {
- case AirportRunways::RUNWAY_14:
- break;
- case AirportRunways::RUNWAY_4L:
- muticee[AirportRunways::RUNWAY_15L].lock();
- muticee[AirportRunways::RUNWAY_15R].lock();
- break;
- case AirportRunways::RUNWAY_4R:
- muticee[AirportRunways::RUNWAY_15L].lock();
- muticee[AirportRunways::RUNWAY_15R].lock();
- break;
- case AirportRunways::RUNWAY_15L:
- muticee[AirportRunways::RUNWAY_4L].lock();
- muticee[AirportRunways::RUNWAY_4R].lock();
- break;
- case AirportRunways::RUNWAY_9:
- muticee[AirportRunways::RUNWAY_4R].lock();
- muticee[AirportRunways::RUNWAY_15R].lock();
- break;
- case AirportRunways::RUNWAY_15R:
- muticee[AirportRunways::RUNWAY_4L].lock();
- muticee[AirportRunways::RUNWAY_4R].lock();
- break;
- default:
- throw "Invalid runway";
- }
- // Check status of the airport for any rule violations
- AirportRunways::checkAirportStatus(runway);
- //runwaysLock.unlock();
- } // End critical region
- // obtain a seed from the system clock:
- unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
- std::default_random_engine generator(seed);
- // Taxi for a random number of milliseconds
- std::uniform_int_distribution<int> taxiTimeDistribution(1, MAX_TAXI_TIME);
- int taxiTime = taxiTimeDistribution(generator);
- {
- lock_guard<mutex> lk(AirportRunways::checkMutex);
- cout << "Airplane #" << airplaneNum << " is taxiing on Runway " << AirportRunways::runwayName(runway)
- << " for " << taxiTime << " milliseconds\n";
- }
- std::this_thread::sleep_for(std::chrono::milliseconds(taxiTime));
- } // end AirportServer::reserveRunway()
- /**
- * Called by an Airplane when it is finished landing
- */
- void AirportServer::releaseRunway(int airplaneNum, AirportRunways::RunwayNumber runway)
- {
- // Release the landing runway and any other needed runways
- { // Begin critical region
- //unique_lock<mutex> runwaysLock(runwaysMutex);
- {
- lock_guard<mutex> lk(AirportRunways::checkMutex);
- cout << "Airplane #" << airplaneNum << " is releasing any needed runway(s) after landing on Runway "
- << AirportRunways::runwayName(runway) << endl;
- }
- /**
- * ***** Add your synchronization here! *****
- */
- // Update the status of the airport to indicate that the landing is complete
- AirportRunways::finishedWithRunway(runway);
- muticee[runway].unlock();
- switch (runway) {
- case AirportRunways::RUNWAY_14:
- break;
- case AirportRunways::RUNWAY_4L:
- muticee[AirportRunways::RUNWAY_15L].unlock();
- muticee[AirportRunways::RUNWAY_15R].unlock();
- break;
- case AirportRunways::RUNWAY_4R:
- muticee[AirportRunways::RUNWAY_15L].unlock();
- muticee[AirportRunways::RUNWAY_15R].unlock();
- break;
- case AirportRunways::RUNWAY_15L:
- muticee[AirportRunways::RUNWAY_4L].unlock();
- muticee[AirportRunways::RUNWAY_4R].unlock();
- break;
- case AirportRunways::RUNWAY_9:
- muticee[AirportRunways::RUNWAY_4R].unlock();
- muticee[AirportRunways::RUNWAY_15R].unlock();
- break;
- case AirportRunways::RUNWAY_15R:
- muticee[AirportRunways::RUNWAY_4L].unlock();
- muticee[AirportRunways::RUNWAY_4R].unlock();
- break;
- default:
- throw "Invalid runway";
- }
- //runwaysLock.unlock();
- } // End critical region
- // obtain a seed from the system clock:
- unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
- std::default_random_engine generator(seed);
- // Wait for a random number of milliseconds before requesting the next landing for this Airplane
- std::uniform_int_distribution<int> waitTimeDistribution(1, MAX_WAIT_TIME);
- int waitTime = waitTimeDistribution(generator);
- {
- lock_guard<mutex> lk(AirportRunways::checkMutex);
- cout << "Airplane #" << airplaneNum << " is waiting for " << waitTime << " milliseconds before landing again\n";
- }
- std::this_thread::sleep_for(std::chrono::milliseconds(waitTime));
- } // end AirportServer::releaseRunway()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement