void unlockYourLane(Road road) { if (posOrigin_X == 12 && posOrigin_Y == 1) {//top road.getOnlyOneMutex(0).WaitOne(); road.setOnlyOne(0, true); road.getOnlyOneMutex(0).ReleaseMutex(); } if (posOrigin_X == 23 && posOrigin_Y == 12) {//right road.getOnlyOneMutex(1).WaitOne(); road.setOnlyOne(1, true); road.getOnlyOneMutex(1).ReleaseMutex(); } if (posOrigin_X == 13 && posOrigin_Y == 23) {//bottom road.getOnlyOneMutex(3).WaitOne(); road.setOnlyOne(3, true); road.getOnlyOneMutex(3).ReleaseMutex(); } if (posOrigin_X == 1 && posOrigin_Y == 13) {//left road.getOnlyOneMutex(2).WaitOne(); road.setOnlyOne(2, true); road.getOnlyOneMutex(2).ReleaseMutex(); } }
bool tryToMove() { if (endOfRoad(pos_X, pos_Y, road)) { return(false); } //wykonaj ruch jeżeli możesz if (road.straightRoad(pos_X, pos_Y)) { singleMove(); } else { //crossing rules roadGod.Wait(); getRightCarPositions(pos_X, pos_Y); bool lanePassPermission = false; road.getOnlyOneMutex(crossingPos).WaitOne(); lanePassPermission = road.getOnlyOne(crossingPos); road.getOnlyOneMutex(crossingPos).ReleaseMutex(); if (lanePassPermission) { if (carDir == CarDirection.TURN_RIGHT) { //singleMove(); if (singleMove()) { road.getOnlyOneMutex(crossingPos).WaitOne(); lanePassPermission = road.getOnlyOne(crossingPos); road.setOnlyOne(crossingPos, false); road.getOnlyOneMutex(crossingPos).ReleaseMutex(); } //..^-..ZABLOKUJ PAS } else { //otworz mutex sasiada i zamknij go dopiero po rozpatrzeniu calej skewencji ruchu // road.GetRoadMutex(rightPosX, rightPosY).WaitOne(); // road.GetRoadMutex(12, 12).WaitOne(); road.GetRoadMutex(13, 12).WaitOne(); road.GetRoadMutex(12, 13).WaitOne(); road.GetRoadMutex(13, 13).WaitOne(); if ((!road.checkSpace(rightPosX, rightPosY)) && roadWithoutPrio()) { //warunek- jeśli po twojej prawej jest false, to znaczy ze ktos tam stoi //hierarchia zasobów- zignoruj to że ktoś stoi bo pas na którym jesteś ma pierwszeństwo //wait for your turn } else { //youCanTryDrive(); int ccNumber = 0; if (!road.checkSpace(12, 12)) { ccNumber++; } if (!road.checkSpace(13, 12)) { ccNumber++; } if (!road.checkSpace(12, 13)) { ccNumber++; } if (!road.checkSpace(13, 13)) { ccNumber++; } //!!!!!!!!!...w tym miejscu trzeba trzymac zalokowany mutex drogi na którą się wybiera nasz auto //puszczamy dopiero po skonczeniu ruchu auta if (ccNumber >= 3) { //u cant drive } else { //kolizje hipotetyczne if (!roadWithoutPrio()) { //przy wykrywaniu kolizji powinien byc tryb z tylko jedna droga pierwszenstwa //dwie dorgi z pierwszeństwem poskutkowałyby podwójnym losowaniem czy zaszła kolizja int ccNumber2 = 0; if (!road.checkSpace(12, 12) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(13, 12) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(12, 13) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(13, 13) || getCarDecision()) { ccNumber2++; } if (ccNumber2 == 4) { road.getCrossingCarsNumberMutex().WaitOne();//bad name but already existed road.incCrossingCarsNumber(); road.getCrossingCarsNumberMutex().ReleaseMutex(); } //co z przypadkiem keidy choc jedno auto skreca w prawo? //komu to sprawdzac- wszelkim autom na skrzyżowaniu? } //u can drive singleMove(); } } road.GetRoadMutex(13, 13).ReleaseMutex(); road.GetRoadMutex(12, 13).ReleaseMutex(); road.GetRoadMutex(13, 12).ReleaseMutex(); road.GetRoadMutex(12, 12).ReleaseMutex(); //roadGod.Release(); } } else { //wait for your turn } roadGod.Release(); } //car after trying to move correctRotation(pos_X, pos_Y, carDestination); return(true); }