Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Отвергнутые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=50)
-   -   [patch] краш на UnloadGrid (http://mangos.ytdb.ru/showthread.php?t=1332)

Insider42 31.05.2010 09:34

[patch] краш на UnloadGrid
 
Устраняет несколько видов крашей связанных с выгрузкой гридов, вот один из них http://paste2.org/p/856730


Взят отсюда http://github.com/SilverIce/mangos/c...9086ede3e28f9a
Автор: SilverIce
Код:

diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index fc7dab7..be07b5e 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -624,9 +624,9 @@ void Map::Update(const uint32 &t_diff)
        CellArea area = Cell::CalculateCellArea(*plr, GetVisibilityDistance());
        area.ResizeBorders(begin_cell, end_cell);
 
-        for(uint32 x = begin_cell.x_coord; x <= end_cell.x_coord; ++x)
+        for(uint32 x = begin_cell.x_coord; x < end_cell.x_coord; ++x)
        {
-            for(uint32 y = begin_cell.y_coord; y <= end_cell.y_coord; ++y)
+            for(uint32 y = begin_cell.y_coord; y < end_cell.y_coord; ++y)
            {
                // marked cells are those that have been visited
                // don't visit the same cell twice
@@ -672,9 +672,9 @@ void Map::Update(const uint32 &t_diff)
            begin_cell << 1; begin_cell -= 1;              // upper left
            end_cell >> 1; end_cell += 1;                  // lower right
 
-            for(uint32 x = begin_cell.x_coord; x <= end_cell.x_coord; ++x)
+            for(uint32 x = begin_cell.x_coord; x < end_cell.x_coord; ++x)
            {
-                for(uint32 y = begin_cell.y_coord; y <= end_cell.y_coord; ++y)
+                for(uint32 y = begin_cell.y_coord; y < end_cell.y_coord; ++y)
                {
                    // marked cells are those that have been visited
                    // don't visit the same cell twice

Поднял аптайм моего сервера с максимального 5ч до 20ч (в данный момент)

xex 01.06.2010 17:05

У меня наоборот :swoon2:
Без этого патча работал по 2-е суток со средним онлайном около 180.
Сегодня уже три раза крашнулся:
Код:

004DE7F4  00000000  MapInstanced::RemoveGridMapReference+D4
004DE5F1  00000000  Map::UnloadGrid+311
004DE917  00000000  Map::UnloadAll+87
004D95B5  00000000  Map::~Map+65
004E1B52  00000000  InstanceMap::~InstanceMap+92
004FBBD0  00000000  InstanceMap::`vector deleting destructor'+50
008C07B0  00000000  MapInstanced::DestroyInstance+B0
008BF802  00000000  MapInstanced::Update+C2
006E6160  00000000  MapManager::Update+120
00641375  00000000  World::Update+805
0045663E  00000000  WorldRunnable::run+8E

Откачу, посмотрю, но думаю что из-за этого.

Добавлю:
Проблема то ясна - попытка доступа по указателю указывающему в "небо".
Почему-то в коде не используется общепринятая практика зануляющая указатели при чистке.
Тогда такой проблемы в принципе бы быть не могло...

Vladimir 02.06.2010 07:14

Я пере-просмотрел код и не вижу ничего корректного в патче.

Мы вибираем наборы ячеек вокруг конкретной в которой стоит игрок.
+- на определенное колличество.

Операторы << -= >> += определены так что всегда возвращают номер ячейки не выходящей за пределы (0..LIMIT-1)

Соответствеено цикл _должен_ включать правый пограничный номер.
Т.е. _должен_ быть в ввиде y <= end_cell.y_coord

Иначем у вас нарушается симметрия области.

Проблема может быть только если
CellArea area = Cell::CalculateCellArea(*plr, GetVisibilityDistance());

вычисляет размеры области некоректно

SilverIce 02.06.2010 07:55

спасибо за рекламу, но это не совсем мой патч..
у меня end_cell получена таким путем, что по ней обращаться к гриду нельзя - иначе краш
а ResizeBorders всегда возвращает существущую ячейку

хотя может то что мы перестаем обновлять краевые ячейки и это как то и влияет на уменьшения крашей с unload grid, но не прямо..

Insider42 02.06.2010 09:36

Цитата:

Сообщение от Vladimir (Сообщение 7834)
Проблема может быть только если
CellArea area = Cell::CalculateCellArea(*plr, GetVisibilityDistance());

вычисляет размеры области некоректно

Есть способ как-то проверить и по возможности предотвратить это?

Цитата:

Сообщение от SilverIce (Сообщение 7836)
хотя может то что мы перестаем обновлять краевые ячейки и это как то и влияет на уменьшения крашей с unload grid, но не прямо..

С момента использования патча действительно небыло ниодного краша на гридах. Уже 4й день использую... До этого раз в 5-6 часов долбали


Текущее время: 23:04. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS