예제 #1
0
파일: Car.cs 프로젝트: Vyctrus/SO2_crossing
 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();
     }
 }
예제 #2
0
파일: Car.cs 프로젝트: Vyctrus/SO2_crossing
        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);
        }