bool CmdLineHandler::toBeLeader() { USES_CONVERSION; bool ret = true; //create share memory sharedMemHandle_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHARED_MEM_SIZE, A2W(userShareMemName_)); if (NULL == sharedMemHandle_) { fatalbox("%s", "can't get shared memory handle!"); exit(-1); } sharedType_ = (GetLastError() == ERROR_ALREADY_EXISTS) ? SHARED_TYPE_FOLLOWER : SHARED_TYPE_LEADER; sharedBuffer_ = (char* ) MapViewOfFile(sharedMemHandle_, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, SHARED_MEM_SIZE); if (NULL == sharedBuffer_){ fatalbox("%s", "can't get shared memory!"); CloseHandle(sharedMemHandle_); exit(-1); } if (isLeader()){ memset(sharedBuffer_, 0, SHARED_MEM_SIZE); } return isLeader(); }
void GUIVehicle::selectBlockingFoes() const { double dist = myLane->getLength() - getPositionOnLane(); #ifdef DEBUG_FOES std::cout << SIMTIME << " selectBlockingFoes veh=" << getID() << " dist=" << dist << " numLinks=" << myLFLinkLanes.size() << "\n"; #endif for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) { const DriveProcessItem& dpi = *i; if (dpi.myLink == nullptr) { /// XXX if the vehicle intends to stop on an intersection, there could be a relevant exitLink (see #4299) continue; } std::vector<const SUMOVehicle*> blockingFoes; std::vector<const MSPerson*> blockingPersons; #ifdef DEBUG_FOES std::cout << " foeLink=" << dpi.myLink->getViaLaneOrLane()->getID() << "\n"; const bool isOpen = #endif dpi.myLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), getVehicleType().getLength(), getImpatience(), getCarFollowModel().getMaxDecel(), getWaitingTime(), getLateralPositionOnLane(), &blockingFoes); #ifdef DEBUG_FOES if (!isOpen) { std::cout << " closed due to:\n"; for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { std::cout << " " << (*it)->getID() << "\n"; } } #endif if (getLaneChangeModel().getShadowLane() != nullptr) { MSLink* parallelLink = dpi.myLink->getParallelLink(getLaneChangeModel().getShadowDirection()); if (parallelLink != nullptr) { const double shadowLatPos = getLateralPositionOnLane() - getLaneChangeModel().getShadowDirection() * 0.5 * ( myLane->getWidth() + getLaneChangeModel().getShadowLane()->getWidth()); #ifdef DEBUG_FOES const bool isShadowOpen = #endif parallelLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), getVehicleType().getLength(), getImpatience(), getCarFollowModel().getMaxDecel(), getWaitingTime(), shadowLatPos, &blockingFoes); #ifdef DEBUG_FOES if (!isShadowOpen) { std::cout << " foes at shadow link=" << parallelLink->getViaLaneOrLane()->getID() << ":\n"; for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { std::cout << " " << (*it)->getID() << "\n"; } } #endif } } for (std::vector<const SUMOVehicle*>::const_iterator it = blockingFoes.begin(); it != blockingFoes.end(); ++it) { gSelected.select(static_cast<const GUIVehicle*>(*it)->getGlID()); } #ifdef DEBUG_FOES gDebugFlag1 = true; #endif const MSLink::LinkLeaders linkLeaders = (dpi.myLink)->getLeaderInfo(this, dist, &blockingPersons); #ifdef DEBUG_FOES gDebugFlag1 = false; #endif for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) { // the vehicle to enter the junction first has priority const GUIVehicle* leader = dynamic_cast<const GUIVehicle*>(it->vehAndGap.first); if (leader != nullptr) { if (isLeader(dpi.myLink, leader)) { gSelected.select(leader->getGlID()); #ifdef DEBUG_FOES std::cout << " linkLeader=" << leader->getID() << "\n"; #endif } } else { for (std::vector<const MSPerson*>::iterator it_p = blockingPersons.begin(); it_p != blockingPersons.end(); ++it_p) { const GUIPerson* foe = dynamic_cast<const GUIPerson*>(*it_p); if (foe != nullptr) { gSelected.select(foe->getGlID()); //std::cout << SIMTIME << " veh=" << getID() << " is blocked on link " << dpi.myLink->getRespondIndex() << " to " << dpi.myLink->getViaLaneOrLane()->getID() << " by pedestrian. dist=" << it->second << "\n"; } } } } dist += dpi.myLink->getViaLaneOrLane()->getLength(); } }