* disabled thread locking in DrawObjMgr (Object pointer corruption problem solved in [263])

* fixed setting MapMgr to loading state to fix problems with GUI thread trying to access not yet loaded maps
This commit is contained in:
false_genesis 2008-04-02 18:40:39 +00:00
parent 6d5b8de2d5
commit 57fed6d6cc
4 changed files with 35 additions and 13 deletions

View File

@ -50,12 +50,12 @@ void DrawObjMgr::UnlinkAll(void)
void DrawObjMgr::Update(void) void DrawObjMgr::Update(void)
{ {
ZThread::FastMutex mut; //ZThread::FastMutex mut;
// now for the threadsafe part: lock every thread except this one // now for the threadsafe part: lock every thread except this one
// to prevent obj ptr corruption caused by other running threads // to prevent obj ptr corruption caused by other running threads
// TODO: lock only main thread (that should be the only one to delete objects anyway!) // TODO: lock only main thread (that should be the only one to delete objects anyway!)
mut.acquire(); //mut.acquire();
// add objects waiting on the add queue to the real storage // add objects waiting on the add queue to the real storage
while(_add.size()) while(_add.size())
@ -89,6 +89,6 @@ void DrawObjMgr::Update(void)
i->second->Draw(); i->second->Draw();
} }
mut.release(); //mut.release();
} }

View File

@ -234,6 +234,7 @@ void SceneWorld::UpdateTerrain(void)
logdebug("SceneWorld: Waiting until maps are loaded..."); logdebug("SceneWorld: Waiting until maps are loaded...");
while(!mapmgr->Loaded()) while(!mapmgr->Loaded())
device->sleep(1); device->sleep(1);
logdebug("SceneWorld: ... maps done loading");
} }
// TODO: as soon as WMO-only worlds are implemented, remove this!! // TODO: as soon as WMO-only worlds are implemented, remove this!!
@ -251,6 +252,7 @@ void SceneWorld::UpdateTerrain(void)
// EDIT: it seems to display fine now, but i am still not sure if the way it is done is correct... // EDIT: it seems to display fine now, but i am still not sure if the way it is done is correct...
mutex.acquire(); // prevent other threads from deleting the maptile mutex.acquire(); // prevent other threads from deleting the maptile
logdebug("SceneWorld: Displaying MapTiles near grids x:%u y:%u",mapmgr->GetGridX(),mapmgr->GetGridY()); logdebug("SceneWorld: Displaying MapTiles near grids x:%u y:%u",mapmgr->GetGridX(),mapmgr->GetGridY());
logdebug("Loaded maps: %u: %s",mapmgr->GetLoadedMapsCount(), mapmgr->GetLoadedTilesString().c_str());
for(s32 tiley = 0; tiley < 3; tiley++) for(s32 tiley = 0; tiley < 3; tiley++)
{ {
for(s32 tilex = 0; tilex < 3; tilex++) for(s32 tilex = 0; tilex < 3; tilex++)
@ -277,7 +279,7 @@ void SceneWorld::UpdateTerrain(void)
} }
else else
{ {
logerror("SceneWorld: MapTile not loaded, can't apply heightmap!"); logerror("SceneWorld: MapTile (%u, %u) not loaded, can't apply heightmap!", mapmgr->GetGridX()+tilex, mapmgr->GetGridY()+tiley);
} }
} }
} }
@ -310,15 +312,20 @@ void SceneWorld::UpdateTerrain(void)
// to set the correct position of the terrain, we have to use the top-left tile's coords as terrain base pos // to set the correct position of the terrain, we have to use the top-left tile's coords as terrain base pos
MapTile *maptile = mapmgr->GetNearTile(-1, -1); MapTile *maptile = mapmgr->GetNearTile(-1, -1);
vector3df tpos(0,0,0); // height already managed when building up terrain (-> Y = always 0)
if(maptile) if(maptile)
{ {
vector3df tpos;
tpos.X = -maptile->GetBaseX(); tpos.X = -maptile->GetBaseX();
tpos.Y = 0; // height already managed when building up terrain
tpos.Z = -maptile->GetBaseY(); tpos.Z = -maptile->GetBaseY();
}
else if(maptile = mapmgr->GetCurrentTile()) // this is tile (0, 0) in relative coords
{
logdebug("SceneWorld: Using alternative coords due to missing MapTile");
tpos.X = -(maptile->GetBaseX() + TILESIZE);
tpos.Y = -(maptile->GetBaseY() + TILESIZE);
}
logdebug("SceneWorld: Setting position of terrain (x:%.2f y:%.2f z:%.2f)", tpos.X, tpos.Y, tpos.Z); logdebug("SceneWorld: Setting position of terrain (x:%.2f y:%.2f z:%.2f)", tpos.X, tpos.Y, tpos.Z);
terrain->setPosition(tpos); terrain->setPosition(tpos);
}
logdebug("SceneWorld: Smoothing terrain normals..."); logdebug("SceneWorld: Smoothing terrain normals...");
terrain->smoothNormals(); terrain->smoothNormals();

View File

@ -55,6 +55,7 @@ void MapMgr::Update(float x, float y, uint32 m)
_LoadNearTiles(_gridx,_gridy,m); _LoadNearTiles(_gridx,_gridy,m);
_UnloadOldTiles(); _UnloadOldTiles();
} }
_mapsLoaded = true; // at this point, everything should be loaded (if maps existing)
} }
void MapMgr::Flush(void) void MapMgr::Flush(void)
@ -67,6 +68,7 @@ void MapMgr::Flush(void)
void MapMgr::_LoadNearTiles(uint32 gx, uint32 gy, uint32 m) void MapMgr::_LoadNearTiles(uint32 gx, uint32 gy, uint32 m)
{ {
_mapsLoaded = false;
logdebug("MAPMGR: Loading near tiles for (%u, %u) map %u",gx,gy,m); logdebug("MAPMGR: Loading near tiles for (%u, %u) map %u",gx,gy,m);
for(uint32 v = gy-1; v <= gy+1; v++) for(uint32 v = gy-1; v <= gy+1; v++)
{ {
@ -75,11 +77,11 @@ void MapMgr::_LoadNearTiles(uint32 gx, uint32 gy, uint32 m)
_LoadTile(h,v,m); _LoadTile(h,v,m);
} }
} }
_mapsLoaded = true;
} }
void MapMgr::_LoadTile(uint32 gx, uint32 gy, uint32 m) void MapMgr::_LoadTile(uint32 gx, uint32 gy, uint32 m)
{ {
_mapsLoaded = false;
if(!_tiles->TileExists(gx,gy)) if(!_tiles->TileExists(gx,gy))
{ {
if(TileExistsInFile(m,gx,gy)) if(TileExistsInFile(m,gx,gy))
@ -121,11 +123,11 @@ void MapMgr::_LoadTile(uint32 gx, uint32 gy, uint32 m)
void MapMgr::_UnloadOldTiles(void) void MapMgr::_UnloadOldTiles(void)
{ {
for(uint32 gy=0; gy<64; gy++) for(int32 gy=0; gy<64; gy++)
{ {
for(uint32 gx=0; gx<64; gx++) for(int32 gx=0; gx<64; gx++)
{ {
if( (_gridx < gx-1 || _gridx > gx+1) && (_gridy < gy-1 || _gridy > gy+1) ) if( (int32(_gridx) < gx-1 || int32(_gridx) > gx+1) && (int32(_gridy) < gy-1 || int32(_gridy) > gy+1) )
{ {
if(_tiles->GetTile(gx,gy)) if(_tiles->GetTile(gx,gy))
{ {
@ -200,3 +202,15 @@ float MapMgr::GetZ(float x, float y)
return 0;*/ return 0;*/
} }
std::string MapMgr::GetLoadedTilesString(void)
{
std::stringstream s;
for(uint32 x = 0; x < 64; x++)
{
for(uint32 y = 0; y < 64; y++)
if(_tiles->GetTile(x,y))
s << "(" << x << "|" << y << ") ";
}
return s.str();
}

View File

@ -27,6 +27,7 @@ public:
MapTile *GetNearTile(int32, int32); MapTile *GetNearTile(int32, int32);
inline bool Loaded(void) { return _mapsLoaded; } inline bool Loaded(void) { return _mapsLoaded; }
uint32 GetLoadedMapsCount(void); uint32 GetLoadedMapsCount(void);
std::string GetLoadedTilesString(void);
inline uint32 GetGridX(void) { return _gridx; } inline uint32 GetGridX(void) { return _gridx; }
inline uint32 GetGridY(void) { return _gridy; } inline uint32 GetGridY(void) { return _gridy; }