- bugfixes related to cppcheck report

- bugfixes found using valgrind (memory leaks)
This commit is contained in:
Mark Vejvoda 2011-12-02 16:07:59 +00:00
parent 4885f3f3a6
commit d33e1174a5
59 changed files with 772 additions and 272 deletions

View File

@ -476,7 +476,7 @@ bool PathFinder::addToOpenSet(Unit *unit, Node *node,const Vec2i finalPos, Vec2i
}
direction PathFinder::directionOfMove(Vec2i to, Vec2i from) {
direction PathFinder::directionOfMove(Vec2i to, Vec2i from) const {
if (from.x == to.x) {
if (from.y == to.y)
return -1;
@ -545,16 +545,16 @@ Vec2i PathFinder::adjustInDirection(Vec2i c, int dir) {
return Vec2i( -1, -1 );
}
bool PathFinder::directionIsDiagonal(direction dir) {
bool PathFinder::directionIsDiagonal(direction dir) const {
return (dir % 2) != 0;
}
// logical implication operator
bool PathFinder::implies (bool a, bool b) {
bool PathFinder::implies(bool a, bool b) const {
return a ? b : true;
}
directionset PathFinder::addDirectionToSet (directionset dirs, direction dir) {
directionset PathFinder::addDirectionToSet(directionset dirs, direction dir) const {
return dirs | 1 << dir;
}
@ -595,7 +595,7 @@ directionset PathFinder::naturalNeighbours(direction dir) {
// return and remove a direction from the set
// returns NO_DIRECTION if the set was empty
direction PathFinder::nextDirectionInSet (directionset *dirs) {
direction PathFinder::nextDirectionInSet(directionset *dirs) const {
for (int i = 0; i < 8; i++) {
char bit = 1 << i;
if (*dirs & bit) {

View File

@ -133,16 +133,16 @@ private:
bool contained(Vec2i c);
direction directionOfMove(Vec2i to, Vec2i from);
direction directionOfMove(Vec2i to, Vec2i from) const;
direction directionWeCameFrom(Vec2i node, Vec2i nodeFrom);
bool isEnterable(Vec2i coord);
Vec2i adjustInDirection(Vec2i c, int dir);
bool directionIsDiagonal(direction dir);
bool directionIsDiagonal(direction dir) const;
directionset forcedNeighbours(Vec2i coord,direction dir);
bool implies (bool a, bool b);
directionset addDirectionToSet (directionset dirs, direction dir);
bool implies(bool a, bool b) const;
directionset addDirectionToSet(directionset dirs, direction dir) const;
directionset naturalNeighbours(direction dir);
direction nextDirectionInSet (directionset *dirs);
direction nextDirectionInSet(directionset *dirs) const;
Vec2i jump(Vec2i dest, direction dir, Vec2i start,std::vector<Vec2i> &path,int pathLength);
bool addToOpenSet(Unit *unit, Node *node,const Vec2i finalPos, Vec2i sucPos, bool &nodeLimitReached,int maxNodeCount,Node **newNodeAdded,bool bypassChecks);
};

View File

@ -335,6 +335,12 @@ bool GraphicButton::mouseMove(int x, int y){
const int GraphicListBox::defH= 22;
const int GraphicListBox::defW= 140;
GraphicListBox::GraphicListBox(std::string containerName, std::string objName)
: GraphicComponent(containerName, objName) {
selectedItemIndex = 0;
lighted = false;
}
void GraphicListBox::init(int x, int y, int w, int h, Vec3f textColor){
GraphicComponent::init(x, y, w, h);
@ -450,6 +456,13 @@ bool GraphicListBox::mouseClick(int x, int y){
const int GraphicMessageBox::defH= 240;
const int GraphicMessageBox::defW= 350;
GraphicMessageBox::GraphicMessageBox(std::string containerName, std::string objName)
: GraphicComponent(containerName, objName) {
buttonCount = 0;
header = "";
}
void GraphicMessageBox::init(const string &button1Str, const string &button2Str, int newWidth,int newHeight) {
init(button1Str,newWidth,newHeight);
@ -546,6 +559,11 @@ bool GraphicMessageBox::mouseClick(int x, int y, int &clickedButton){
const int GraphicLine::defH= 5;
const int GraphicLine::defW= 1000;
GraphicLine::GraphicLine(std::string containerName, std::string objName)
: GraphicComponent(containerName, objName) {
horizontal = false;
}
void GraphicLine::init(int x, int y, int w, int h){
GraphicComponent::init(x, y, w, h);
horizontal=true;
@ -558,6 +576,12 @@ void GraphicLine::init(int x, int y, int w, int h){
const int GraphicCheckBox::defH= 22;
const int GraphicCheckBox::defW= 22;
GraphicCheckBox::GraphicCheckBox(std::string containerName, std::string objName)
: GraphicComponent(containerName, objName) {
value = false;
lighted = false;
}
void GraphicCheckBox::init(int x, int y, int w, int h){
GraphicComponent::init(x, y, w, h);
value=true;
@ -591,6 +615,19 @@ bool GraphicCheckBox::mouseClick(int x, int y){
const int GraphicScrollBar::defThickness=20;
const int GraphicScrollBar::defLength= 200;
GraphicScrollBar::GraphicScrollBar(std::string containerName, std::string objName)
: GraphicComponent(containerName, objName) {
lighted = false;
horizontal = false;
elementCount = 0;
visibleSize = 0;
visibleStart = 0;
// position on component for renderer
visibleCompPosStart = 0;
visibleCompPosEnd = 0;
}
void GraphicScrollBar::init(int x, int y, bool horizontal,int length, int thickness){
GraphicComponent::init(x, y, horizontal?length:thickness,horizontal?thickness:length );
this->horizontal=horizontal;

View File

@ -199,7 +199,8 @@ private:
bool lighted;
Vec3f textColor;
public:
public:
GraphicListBox(std::string containerName="", std::string objName="");
void init(int x, int y, int w=defW, int h=defH, Vec3f textColor=Vec3f(1.f, 1.f, 1.f));
int getItemCount() const {return items.size();}
@ -243,6 +244,7 @@ private:
string header;
public:
GraphicMessageBox(std::string containerName="", std::string objName="");
void init(const string &button1Str, const string &button2Str, int newWidth=-1,int newHeight=-1);
void init(const string &button1Str, int newWidth=-1,int newHeight=-1);
@ -274,6 +276,7 @@ private:
bool horizontal;
public:
GraphicLine(std::string containerName="", std::string objName="");
void init(int x, int y, int w=defW, int h=defH);
bool getHorizontal() const {return horizontal;}
void setHorizontal(bool horizontal) {this->horizontal= horizontal;}
@ -293,6 +296,7 @@ private:
bool lighted;
public:
GraphicCheckBox(std::string containerName="", std::string objName="");
void init(int x, int y, int w=defW, int h=defH);
bool getValue() const {return value;}
void setValue(bool value) {this->value= value;}
@ -323,6 +327,7 @@ private:
int visibleCompPosEnd;
public:
GraphicScrollBar(std::string containerName="", std::string objName="");
void init(int x, int y, bool horizontal,int length=defLength, int thickness=defThickness);
virtual bool mouseDown(int x, int y);
virtual bool mouseMove(int x, int y);

View File

@ -200,7 +200,7 @@ void ChatManager::keyDown(SDL_KeyboardEvent key) {
}
}
}
if(matchedIndexes.size() > 0) {
if(matchedIndexes.empty() == false) {
int newMatchedIndex = -1;
for(unsigned int index = 0; index < matchedIndexes.size(); ++index) {
int possibleMatchIndex = matchedIndexes[index];
@ -248,7 +248,7 @@ void ChatManager::keyDown(SDL_KeyboardEvent key) {
}
}
}
if(matchedIndexes.size() > 0) {
if(matchedIndexes.empty() == false) {
int newMatchedIndex = -1;
for(unsigned int index = 0; index < matchedIndexes.size(); ++index) {
int possibleMatchIndex = matchedIndexes[index];
@ -333,7 +333,7 @@ void ChatManager::switchOnEdit() {
void ChatManager::deleteText(int deleteCount,bool addToAutoCompleteBuffer) {
if(text.empty() == false) {
for(unsigned int i = 0; i < deleteCount; ++i) {
if(textCharLength.size() > 0) {
if(textCharLength.empty() == false) {
//printf("BEFORE DEL textCharLength.size() = %d textCharLength[textCharLength.size()-1] = %d text.length() = %d\n",textCharLength.size(),textCharLength[textCharLength.size()-1],text.length());
if(textCharLength[textCharLength.size()-1] > text.length()) {

View File

@ -941,7 +941,7 @@ void Game::init(bool initForPreviewOnly) {
//init renderer state
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Initializing renderer\n",__FILE__,__FUNCTION__);
logger.add(Lang::getInstance().get("LogScreenGameLoadingInitRenderer","",true), true);
renderer.initGame(this);
renderer.initGame(this,this->getGameCameraPtr());
for(int i=0; i < world.getFactionCount(); ++i) {
Faction *faction= world.getFaction(i);
@ -1307,7 +1307,7 @@ void Game::update() {
}
scriptManager.init(&world, &gameCamera);
renderer.initGame(this);
renderer.initGame(this,this->getGameCameraPtr());
//sounds
//soundRenderer.stopAllSounds(fadeMusicMilliseconds);
@ -1349,7 +1349,7 @@ void Game::update() {
catch(const exception &ex) {
gameStarted = true;
throw ex;
throw;
}
}
}
@ -1457,7 +1457,7 @@ void Game::render() {
renderFps++;
totalRenderFps++;
NetworkManager &networkManager= NetworkManager::getInstance();
//NetworkManager &networkManager= NetworkManager::getInstance();
if(this->masterserverMode == false) {
renderWorker();
}
@ -1470,8 +1470,7 @@ void Game::render() {
int connectedClients=0;
for(int i = 0; i < world.getFactionCount(); ++i) {
Faction *faction = world.getFaction(i);
ConnectionSlot *slot = server->getSlot(faction->getStartLocationIndex());
if(slot != NULL && slot->isConnected() == true) {
if(server->isClientConnected(faction->getStartLocationIndex()) == true) {
connectedClients++;
}
}
@ -2572,7 +2571,7 @@ Stats Game::quitGame() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
endStats = *(world.getStats());
NetworkManager &networkManager= NetworkManager::getInstance();
//NetworkManager &networkManager= NetworkManager::getInstance();
if(this->masterserverMode == true) {
endStats.setIsMasterserverMode(true);
}
@ -2813,6 +2812,11 @@ void Game::render2d(){
str+= "Log buffer count: " + intToStr(SystemFlags::getLogEntryBufferCount())+"\n";
}
str+= "UnitRangeCellsLookupItemCache: " + world.getUnitUpdater()->getUnitRangeCellsLookupItemCacheStats()+"\n";
str+= "ExploredCellsLookupItemCache: " + world.getExploredCellsLookupItemCacheStats()+"\n";
str+= "FowAlphaCellsLookupItemCache: " + world.getFowAlphaCellsLookupItemCacheStats()+"\n";
//str+= "AllFactionsCacheStats: " + world.getAllFactionsCacheStats()+"\n";
//str+= "AttackWarningCount: " + intToStr(world.getUnitUpdater()->getAttackWarningCount()) + "\n";
str+= "Map: " + gameSettings.getMap() +"\n";
@ -2831,15 +2835,15 @@ void Game::render2d(){
for(int i= 0; i<4; ++i){
str+= "(" + intToStr(visibleQuad.p[i].x) + "," +intToStr(visibleQuad.p[i].y) + ") ";
}
str+= "\n";
str+= "Visible quad camera: ";
for(int i= 0; i<4; ++i){
str+= "(" + intToStr(visibleQuadCamera.p[i].x) + "," +intToStr(visibleQuadCamera.p[i].y) + ") ";
}
// str+= "\n";
// str+= "Visible quad camera: ";
// for(int i= 0; i<4; ++i){
// str+= "(" + intToStr(visibleQuadCamera.p[i].x) + "," +intToStr(visibleQuadCamera.p[i].y) + ") ";
// }
str+= "\n";
str+= "Visible quad area: " + floatToStr(visibleQuad.area()) +"\n";
str+= "Visible quad camera area: " + floatToStr(visibleQuadCamera.area()) +"\n";
// str+= "Visible quad camera area: " + floatToStr(visibleQuadCamera.area()) +"\n";
// Rect2i boundingRect= visibleQuad.computeBoundingRect();
// Rect2i scaledRect= boundingRect/Map::cellScale;
@ -2898,7 +2902,7 @@ void Game::render2d(){
if(renderer.getShowDebugUI() == true) {
const Metrics &metrics= Metrics::getInstance();
//int mx= metrics.getMinimapX();
int my= metrics.getMinimapY();
//int my= metrics.getMinimapY();
//int mw= metrics.getMinimapW();
int mh= metrics.getMinimapH();
const Vec4f fontColor=getGui()->getDisplay()->getColor();

View File

@ -154,13 +154,14 @@ public:
Game(Program *program, const GameSettings *gameSettings, bool masterserverMode);
~Game();
bool isMasterserverMode() const { return masterserverMode; }
//get
GameSettings *getGameSettings() {return &gameSettings;}
void setGameSettings(GameSettings *settings) { gameSettings = *settings;}
const GameSettings *getReadOnlyGameSettings() const {return &gameSettings;}
const GameCamera *getGameCamera() const {return &gameCamera;}
GameCamera *getGameCamera() {return &gameCamera;}
GameCamera *getGameCameraPtr() {return &gameCamera;}
const Commander *getCommander() const {return &commander;}
Gui *getGui() {return &gui;}
const Gui *getGui() const {return &gui;}

View File

@ -30,7 +30,7 @@ namespace Glest { namespace Game {
// class GameCamera
// =====================================================
static std::map<float, std::map<float, std::map<Vec3f, Quad2i> > > cacheVisibleQuad;
//static std::map<float, std::map<float, std::map<Vec3f, Quad2i> > > cacheVisibleQuad;
// ================== PUBLIC =====================
@ -187,7 +187,7 @@ void GameCamera::update(){
}
}
Quad2i GameCamera::computeVisibleQuad() const {
Quad2i GameCamera::computeVisibleQuad() {
//printf("\n@@@ hAng [%f] vAng [%f] fov [%f]\n",hAng,vAng,fov);
if(MaxVisibleQuadItemCache != 0) {

View File

@ -85,6 +85,7 @@ private:
float calculatedDefault;
std::map<float, std::map<float, std::map<Vec3f, Quad2i> > > cacheVisibleQuad;
int MaxVisibleQuadItemCache;
public:
@ -117,7 +118,7 @@ public:
//other
void update();
Quad2i computeVisibleQuad() const;
Quad2i computeVisibleQuad();
void switchState();
void resetPosition();

View File

@ -62,7 +62,20 @@ const int ScriptManager::messageWrapCount= 30;
const int ScriptManager::displayTextWrapCount= 64;
ScriptManager::ScriptManager() {
world = NULL;
gameCamera = NULL;
lastCreatedUnitId = -1;
lastDeadUnitId = 0;
lastDeadUnitCauseOfDeath = 0;
lastDeadUnitKillerId = 0;
lastAttackedUnitId = 0;
lastAttackingUnitId = 0;
gameOver = false;
gameWon = false;
currentTimerTriggeredEventId = 0;
currentCellTriggeredEventId = 0;
currentEventId = 0;
inCellTriggerEvent = false;
}
ScriptManager::~ScriptManager() {

View File

@ -78,6 +78,10 @@ CoreData::CoreData() {
}
CoreData::~CoreData() {
cleanup();
}
void CoreData::cleanup() {
deleteValues(waterSounds.getSoundsPtr()->begin(), waterSounds.getSoundsPtr()->end());
waterSounds.getSoundsPtr()->clear();
}
@ -167,7 +171,7 @@ void CoreData::load() {
}
}
if(logoTextureList.size() == 0) {
if(logoTextureList.empty() == true) {
logosPath= data_path + "data/core/menu/textures/logo*.*";
vector<string> logoFilenames;
findAll(logosPath, logoFilenames, false, false);
@ -200,7 +204,7 @@ void CoreData::load() {
}
//}
}
if(miscTextureList.size() == 0) {
if(miscTextureList.empty() == true) {
introPath= data_path + "data/core/menu/textures/intro*.*";
vector<string> introFilenames;
findAll(introPath, introFilenames, false, false);

View File

@ -88,6 +88,7 @@ public:
static CoreData &getInstance();
void load();
void cleanup();
void loadFonts();
Texture2D *getBackgroundTexture() const {return backgroundTexture;}

View File

@ -300,6 +300,12 @@ void ParticleSystemType::setValues(AttackParticleSystem *ats){
// class ParticleSystemTypeProjectile
// ===========================================================
ParticleSystemTypeProjectile::ParticleSystemTypeProjectile() : ParticleSystemType() {
trajectorySpeed = 0.0f;
trajectoryScale = 0.0f;
trajectoryFrequency = 0.0f;
}
void ParticleSystemTypeProjectile::load(const XmlNode* particleFileNode, const string &dir, const string &path,
RendererInterface *renderer, std::map<string,vector<pair<string, string> > > &loadedFileList,
string parentLoader, string techtreePath) {
@ -373,6 +379,14 @@ ProjectileParticleSystem *ParticleSystemTypeProjectile::create() {
// class ParticleSystemTypeSplash
// ===========================================================
ParticleSystemTypeSplash::ParticleSystemTypeSplash() {
emissionRateFade = 0.0f;
verticalSpreadA = 0.0f;
verticalSpreadB = 0.0f;
horizontalSpreadA = 0.0f;
horizontalSpreadB = 0.0f;
}
void ParticleSystemTypeSplash::load(const XmlNode* particleFileNode, const string &dir, const string &path,
RendererInterface *renderer, std::map<string,vector<pair<string, string> > > &loadedFileList,
string parentLoader, string techtreePath) {

View File

@ -121,6 +121,7 @@ private:
float trajectoryFrequency;
public:
ParticleSystemTypeProjectile();
void load(const XmlNode *particleFileNode, const string &dir, const string &path,
RendererInterface *renderer, std::map<string,vector<pair<string, string> > > &loadedFileList,
string parentLoader, string techtreePath);
@ -134,6 +135,8 @@ public:
class ParticleSystemTypeSplash: public ParticleSystemType {
public:
ParticleSystemTypeSplash();
void load(const XmlNode *particleFileNode, const string &dir, const string &path,
RendererInterface *renderer, std::map<string,vector<pair<string, string> > > &loadedFileList,
string parentLoader, string techtreePath);

View File

@ -162,6 +162,7 @@ Renderer::Renderer(bool masterserverMode) : BaseRenderer() {
this->allowRenderUnitTitles = false;
this->menu = NULL;
this->game = NULL;
this->gameCamera = NULL;
showDebugUI = false;
showDebugUILevel = debugui_fps;
modelRenderer = NULL;
@ -173,6 +174,9 @@ Renderer::Renderer(bool masterserverMode) : BaseRenderer() {
visibleFrameUnitList.clear();
visibleFrameUnitListCameraKey = "";
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
lastRenderFps=MIN_FPS_NORMAL_RENDERING;
shadowsOffDueToMinRender=false;
shadowMapHandle=0;
@ -282,8 +286,12 @@ Renderer::~Renderer() {
cleanupScreenshotThread();
mapSurfaceData.clear();
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
this->menu = NULL;
this->game = NULL;
this->gameCamera = NULL;
}
void Renderer::simpleTask(BaseThread *callingThread) {
@ -368,9 +376,10 @@ void Renderer::init() {
}
void Renderer::initGame(const Game *game){
void Renderer::initGame(const Game *game, GameCamera *gameCamera) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
this->gameCamera = gameCamera;
VisibleQuadContainerCache::enableFrustumCalcs = Config::getInstance().getBool("EnableFrustrumCalcs","true");
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
@ -501,6 +510,9 @@ void Renderer::reset3dMenu() {
// ==================== end ====================
void Renderer::end() {
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
if(Renderer::rendererEnded == true) {
return;
}
@ -536,7 +548,10 @@ void Renderer::end() {
}
void Renderer::endScenario() {
game= NULL;
this->game= NULL;
this->gameCamera = NULL;
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
if(this->masterserverMode == true) {
return;
@ -565,7 +580,8 @@ void Renderer::endScenario() {
}
void Renderer::endGame(bool isFinalEnd) {
game= NULL;
this->game= NULL;
this->gameCamera = NULL;
quadCache = VisibleQuadContainerCache();
quadCache.clearFrustrumData();
@ -1287,8 +1303,7 @@ bool Renderer::CubeInFrustum(vector<vector<float> > &frustum, float x, float y,
}
void Renderer::computeVisibleQuad() {
const GameCamera *gameCamera = game->getGameCamera();
visibleQuad = gameCamera->computeVisibleQuad();
visibleQuad = this->gameCamera->computeVisibleQuad();
//Matrix4 LookAt( gameCamera->getPos(), gameCamera->getPos(), Vector3 up );
//gluLookAt
@ -1391,7 +1406,7 @@ void Renderer::computeVisibleQuad() {
}
if((tl.y > bl.y) || (tr.y > br.y)) {
visibleQuad = game->getGameCamera()->computeVisibleQuad();
visibleQuad = this->gameCamera->computeVisibleQuad();
if(debug) printf("Swap Y???\n");
@ -1446,7 +1461,7 @@ void Renderer::computeVisibleQuad() {
catch(PROJECTION_TO_INFINITY e) {
if(debug) printf("hmm staring at the horizon %d\n",(int)e);
// use historic code solution
visibleQuad = game->getGameCamera()->computeVisibleQuad();
visibleQuad = this->gameCamera->computeVisibleQuad();
}
}
}
@ -5411,7 +5426,7 @@ void Renderer::renderMenuBackground(Camera *camera, float fade, Model *mainModel
}
//characters
if(characterModels.size() > 0) {
if(characterModels.empty() == false) {
float dist= characterPosition.dist(cameraPosition);
float minDist= 3.f;
if(dist < minDist) {

View File

@ -55,6 +55,7 @@ using namespace Shared::PlatformCommon;
//non shared classes
class Config;
class Game;
class GameCamera;
class MainMenu;
class Console;
class MenuBackground;
@ -67,11 +68,14 @@ class SurfaceCell;
// class MeshCallbackTeamColor
// =====================================================
class MeshCallbackTeamColor: public MeshCallback{
class MeshCallbackTeamColor: public MeshCallback {
private:
const Texture *teamTexture;
public:
MeshCallbackTeamColor() : MeshCallback() {
teamTexture = NULL;
}
void setTeamTexture(const Texture *teamTexture) {this->teamTexture= teamTexture;}
virtual void execute(const Mesh *mesh);
@ -97,6 +101,7 @@ protected:
frustumData = obj.frustumData;
proj = obj.proj;
modl = obj.modl;
frustumDataCache = obj.frustumDataCache;
}
public:
@ -234,6 +239,7 @@ private:
//game
const Game *game;
GameCamera *gameCamera;
const MainMenu *menu;
//misc
@ -379,7 +385,7 @@ public:
//init
void init();
void initGame(const Game *game);
void initGame(const Game *game, GameCamera *gameCamera);
void initMenu(const MainMenu *mm);
void reset3d();
void reset2d();

View File

@ -124,7 +124,7 @@ Gui::Gui(){
void Gui::init(Game *game){
this->commander= game->getCommander();
this->gameCamera= game->getGameCamera();
this->gameCamera= game->getGameCameraPtr();
this->console= game->getConsole();
this->world= game->getWorld();
this->game=game;

View File

@ -28,7 +28,7 @@ class Gui;
/// List of selected units and groups
// =====================================================
class Selection: public UnitObserver{
class Selection: public UnitObserver {
public:
typedef vector<Unit*> UnitContainer;
typedef UnitContainer::const_iterator UnitIterator;
@ -45,6 +45,11 @@ private:
Gui *gui;
public:
Selection() : UnitObserver() {
factionIndex = 0;
teamIndex = 0;
gui = NULL;
}
void init(Gui *gui, int factionIndex, int teamIndex);
virtual ~Selection();

View File

@ -297,12 +297,18 @@ Intro::Intro(Program *program):
}
int textureWidth = logoTexture->getTextureWidth();
int textureWidth = 256;
if(logoTexture != NULL) {
textureWidth = logoTexture->getTextureWidth();
}
if(lang.hasString(introTagTextureWidthName,"",true) == true) {
textureWidth = strToInt(lang.get(introTagTextureWidthName,"",true));
}
int textureHeight = logoTexture->getTextureHeight();
int textureHeight = 128;
if(logoTexture != NULL) {
textureHeight = logoTexture->getTextureHeight();
}
if(lang.hasString(introTagTextureHeightName,"",true) == true) {
textureHeight = strToInt(lang.get(introTagTextureHeightName,"",true));
}
@ -559,7 +565,7 @@ void Intro::renderModelBackground() {
// Black background
glClearColor(0, 0, 0, 1);
if(models.size() > 0) {
if(models.empty() == false) {
int difTime= 1000 * timer / GameConstants::updateFps - modelShowTime;
int totalModelShowTime = Intro::introTime - modelShowTime;
int individualModelShowTime = totalModelShowTime / models.size();
@ -569,7 +575,7 @@ void Intro::renderModelBackground() {
//int difTime= 1;
if(difTime > 0) {
if(difTime > ((modelIndex+1) * individualModelShowTime)) {
int oldmodelIndex = modelIndex;
//int oldmodelIndex = modelIndex;
if(modelIndex+1 < models.size()) {
modelIndex++;
@ -750,8 +756,8 @@ void Intro::render() {
if(Renderer::renderText3DEnabled) {
const Metrics &metrics= Metrics::getInstance();
int w= metrics.getVirtualW();
int h= metrics.getVirtualH();
//int w= metrics.getVirtualW();
//int h= metrics.getVirtualH();
renderer.renderText3D(
timingText, coreData.getMenuFontVeryBig3D(), 1,
@ -759,8 +765,8 @@ void Intro::render() {
}
else {
const Metrics &metrics= Metrics::getInstance();
int w= metrics.getVirtualW();
int h= metrics.getVirtualH();
//int w= metrics.getVirtualW();
//int h= metrics.getVirtualH();
renderer.renderText(
timingText, coreData.getMenuFontVeryBig(), 1,

View File

@ -151,7 +151,11 @@ static void cleanupProcessObjects() {
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
if(Renderer::isEnded() == false) Renderer::getInstance().end();
if(Renderer::isEnded() == false) {
Renderer::getInstance().end();
CoreData &coreData= CoreData::getInstance();
coreData.cleanup();
}
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
@ -663,6 +667,7 @@ MainWindow::MainWindow(Program *program) : WindowGl() {
this->popupMenu.setVisible(false);
this->triggerLanguageToggle = false;
this->triggerLanguage = "";
this->cancelLanguageSelection = -1;
}
MainWindow::~MainWindow(){
@ -2850,7 +2855,7 @@ int glestMain(int argc, char** argv) {
}
if(hasCommandArgument(argc, argv,string(GAME_ARGS[GAME_ARG_MASTERSERVER_MODE])) == true) {
Renderer &renderer= Renderer::getInstance(true);
Renderer::getInstance(true);
}
if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_USE_PORTS]) == true) {
@ -3212,7 +3217,7 @@ int glestMain(int argc, char** argv) {
string autoloadMapName = paramPartTokens[1];
GameSettings *gameSettings = &startupGameSettings;
int factionCount= 0;
//int factionCount= 0;
gameSettings->setMap(autoloadMapName);
gameSettings->setTileset("forest");
gameSettings->setTech("megapack");

View File

@ -82,7 +82,7 @@ bool ProgramState::canRender(bool sleepIfCannotRender) {
if(lastFps > maxFPSCap) {
if(sleepIfCannotRender == true) {
sleep(sleepMillis);
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] sleeping because lastFps = %d, maxFPSCap = %d sleepMillis = %d\n",__FILE__,__FUNCTION__,__LINE__,lastFps,maxFPSCap,sleepMillis);
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] sleeping because lastFps = %d, maxFPSCap = %d sleepMillis = %d\n",__FILE__,__FUNCTION__,__LINE__,lastFps,maxFPSCap,sleepMillis);
}
return false;
}
@ -246,6 +246,8 @@ Program::~Program(){
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
Renderer::getInstance().end();
CoreData &coreData= CoreData::getInstance();
coreData.cleanup();
if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);

View File

@ -124,7 +124,7 @@ MenuStateConnectedGame::MenuStateConnectedGame(Program *program, MainMenu *mainM
int aHeadPos=240;
int aPos=aHeadPos-labelOffset;
int networkHeadPos=700;
int networkPos=networkHeadPos-labelOffset;
//int networkPos=networkHeadPos-labelOffset;
int xoffset=0;
//state
@ -1100,8 +1100,8 @@ void MenuStateConnectedGame::updateResourceMultiplier(const int index) {
void MenuStateConnectedGame::mouseClickAdmin(int x, int y, MouseButton mouseButton) {
try {
CoreData &coreData= CoreData::getInstance();
SoundRenderer &soundRenderer= SoundRenderer::getInstance();
//CoreData &coreData= CoreData::getInstance();
//SoundRenderer &soundRenderer= SoundRenderer::getInstance();
//int oldListBoxMapfilterIndex=listBoxMapFilter.getSelectedItemIndex();
if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) {
@ -1316,7 +1316,7 @@ void MenuStateConnectedGame::mouseClickAdmin(int x, int y, MouseButton mouseButt
//}
//ensure thet only 1 human player is present
int oldSelectedIndex = listBoxControls[i].getSelectedItemIndex();
//int oldSelectedIndex = listBoxControls[i].getSelectedItemIndex();
if(clientInterface != NULL && clientInterface->getGameSettings() != NULL &&
clientInterface->getGameSettings()->getStartLocationIndex(clientInterface->getGameSettings()->getThisFactionIndex()) != i &&
listBoxControls[i].mouseClick(x, y)) {
@ -3708,7 +3708,7 @@ void MenuStateConnectedGame::FTPClient_CallbackEvent(string itemName,
// Reload tilesets for the UI
findDirs(Config::getInstance().getPathListForType(ptTechs), techTreeFiles);
int initialTechSelection=0;
//int initialTechSelection=0;
std::vector<string> techsFormatted = techTreeFiles;
for(int i= 0; i < techsFormatted.size(); i++){
techsFormatted.at(i)= formatString(techsFormatted.at(i));

View File

@ -1682,7 +1682,7 @@ void MenuStateCustomGame::render() {
// START - this code ensure player title and player names don't overlap
int offsetPosition=0;
for(int i=0; i < GameConstants::maxPlayers; ++i) {
const Metrics &metrics= Metrics::getInstance();
//const Metrics &metrics= Metrics::getInstance();
FontMetrics *fontMetrics= NULL;
if(Renderer::renderText3DEnabled == false) {
fontMetrics = labelPlayers[i].getFont()->getMetrics();

View File

@ -134,7 +134,7 @@ void MenuStateGraphicInfo::mouseMove(int x, int y, const MouseState *ms){
void MenuStateGraphicInfo::render(){
Renderer &renderer= Renderer::getInstance();
Lang &lang= Lang::getInstance();
//Lang &lang= Lang::getInstance();
renderer.renderButton(&buttonReturn);
renderer.renderLabel(&labelInfo);

View File

@ -957,7 +957,7 @@ string MenuStateMods::refreshMapModInfo(string mapInfo) {
std::vector<std::string> mapInfoList;
Tokenize(mapInfo,mapInfoList,"|");
if(mapInfoList.size() >= 5) {
Config &config = Config::getInstance();
//Config &config = Config::getInstance();
ModInfo modinfo;
modinfo.name = mapInfoList[0];
modinfo.count = mapInfoList[1];
@ -977,7 +977,7 @@ string MenuStateMods::getMapCRC(string mapName) {
Config &config = Config::getInstance();
vector<string> mappaths=config.getPathListForType(ptMaps,"");
string result="";
if(mappaths.size()>0 ){
if(mappaths.empty() == false) {
Checksum checksum;
string itemPath = mappaths[1] + "/" + mapName;
if (fileExists(itemPath)){

View File

@ -33,6 +33,7 @@ namespace Glest{ namespace Game{
// =====================================================
ConnectionSlotThread::ConnectionSlotThread(int slotIndex) : BaseThread() {
this->triggerIdMutex = new Mutex();
this->slotIndex = slotIndex;
this->slotInterface = NULL;
//this->event = NULL;
@ -41,12 +42,18 @@ ConnectionSlotThread::ConnectionSlotThread(int slotIndex) : BaseThread() {
}
ConnectionSlotThread::ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,int slotIndex) : BaseThread() {
this->triggerIdMutex = new Mutex();
this->slotIndex = slotIndex;
this->slotInterface = slotInterface;
//this->event = NULL;
eventList.clear();
}
ConnectionSlotThread::~ConnectionSlotThread() {
delete triggerIdMutex;
triggerIdMutex = NULL;
}
void ConnectionSlotThread::setQuitStatus(bool value) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d value = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
@ -60,7 +67,7 @@ void ConnectionSlotThread::setQuitStatus(bool value) {
void ConnectionSlotThread::signalUpdate(ConnectionSlotEvent *event) {
if(event != NULL) {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
eventList.push_back(*event);
safeMutex.ReleaseLock();
}
@ -69,7 +76,7 @@ void ConnectionSlotThread::signalUpdate(ConnectionSlotEvent *event) {
void ConnectionSlotThread::setTaskCompleted(int eventId) {
if(eventId > 0) {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
//event->eventCompleted = true;
for(int i = 0; i < eventList.size(); ++i) {
ConnectionSlotEvent &slotEvent = eventList[i];
@ -84,13 +91,13 @@ void ConnectionSlotThread::setTaskCompleted(int eventId) {
}
void ConnectionSlotThread::purgeAllEvents() {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
eventList.clear();
safeMutex.ReleaseLock();
}
void ConnectionSlotThread::setAllEventsCompleted() {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
for(int i = 0; i < eventList.size(); ++i) {
ConnectionSlotEvent &slotEvent = eventList[i];
if(slotEvent.eventCompleted == false) {
@ -101,7 +108,7 @@ void ConnectionSlotThread::setAllEventsCompleted() {
}
void ConnectionSlotThread::purgeCompletedEvents() {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
//event->eventCompleted = true;
for(int i = eventList.size() - 1; i >= 0; i--) {
ConnectionSlotEvent &slotEvent = eventList[i];
@ -123,7 +130,7 @@ bool ConnectionSlotThread::canShutdown(bool deleteSelfIfShutdownDelayed) {
}
bool ConnectionSlotThread::isSignalCompleted(ConnectionSlotEvent *event) {
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
bool result = false;
if(event != NULL) {
for(int i = 0; i < eventList.size(); ++i) {
@ -177,7 +184,7 @@ void ConnectionSlotThread::execute() {
break;
}
MutexSafeWrapper safeMutex(&triggerIdMutex,CODE_AT_LINE);
MutexSafeWrapper safeMutex(triggerIdMutex,CODE_AT_LINE);
int eventCount = eventList.size();
if(eventCount > 0) {
ConnectionSlotEvent eventCopy;
@ -233,9 +240,12 @@ void ConnectionSlotThread::execute() {
// =====================================================
ConnectionSlot::ConnectionSlot(ServerInterface* serverInterface, int playerIndex) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
this->mutexSocket = new Mutex();
this->mutexCloseConnection = new Mutex();
this->mutexPendingNetworkCommandList = new Mutex();
this->socketSynchAccessor = new Mutex();
this->connectedRemoteIPAddress = 0;
this->sessionKey = 0;
this->serverInterface = serverInterface;
@ -283,6 +293,18 @@ ConnectionSlot::~ConnectionSlot() {
}
slotThreadWorker = NULL;
delete socketSynchAccessor;
socketSynchAccessor = NULL;
delete mutexPendingNetworkCommandList;
mutexPendingNetworkCommandList = NULL;
delete mutexCloseConnection;
mutexCloseConnection = NULL;
delete mutexSocket;
mutexSocket = NULL;
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] END\n",__FILE__,__FUNCTION__);
}
@ -372,7 +394,7 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) {
//printf("Got new connection for slot = %d\n",playerIndex);
MutexSafeWrapper safeMutex(&mutexCloseConnection,CODE_AT_LINE);
MutexSafeWrapper safeMutex(mutexCloseConnection,CODE_AT_LINE);
this->setSocket(newSocket);
safeMutex.ReleaseLock();
@ -390,7 +412,7 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) {
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
MutexSafeWrapper safeMutexSlot1(&mutexPendingNetworkCommandList,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot1(mutexPendingNetworkCommandList,CODE_AT_LINE);
this->vctPendingNetworkCommandList.clear();
safeMutexSlot1.ReleaseLock();
@ -545,7 +567,7 @@ void ConnectionSlot::update(bool checkForNewClients,int lockedSlotIndex) {
lastReceiveCommandListTime = time(NULL);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] currentFrameCount = %d\n",__FILE__,__FUNCTION__,__LINE__,currentFrameCount);
MutexSafeWrapper safeMutexSlot(&mutexPendingNetworkCommandList,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexPendingNetworkCommandList,CODE_AT_LINE);
for(int i = 0; i < networkMessageCommandList.getCommandCount(); ++i) {
vctPendingNetworkCommandList.push_back(*networkMessageCommandList.getCommand(i));
}
@ -1026,7 +1048,7 @@ void ConnectionSlot::close() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
MutexSafeWrapper safeMutex(&mutexCloseConnection,CODE_AT_LINE);
MutexSafeWrapper safeMutex(mutexCloseConnection,CODE_AT_LINE);
bool updateServerListener = (this->getSocket() != NULL);
this->deleteSocket();
@ -1066,7 +1088,7 @@ bool ConnectionSlot::updateCompleted(ConnectionSlotEvent *event) {
}
void ConnectionSlot::sendMessage(const NetworkMessage* networkMessage) {
MutexSafeWrapper safeMutex(&socketSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(socketSynchAccessor,CODE_AT_LINE);
// Skip text messages not intended for the players preferred language
const NetworkMessageText *textMsg = dynamic_cast<const NetworkMessageText *>(networkMessage);
@ -1088,7 +1110,7 @@ string ConnectionSlot::getHumanPlayerName(int index) {
vector<NetworkCommand> ConnectionSlot::getPendingNetworkCommandList(bool clearList) {
vector<NetworkCommand> ret;
MutexSafeWrapper safeMutexSlot(&mutexPendingNetworkCommandList,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexPendingNetworkCommandList,CODE_AT_LINE);
if(vctPendingNetworkCommandList.empty() == false) {
ret = vctPendingNetworkCommandList;
if(clearList == true) {
@ -1101,7 +1123,7 @@ vector<NetworkCommand> ConnectionSlot::getPendingNetworkCommandList(bool clearLi
}
void ConnectionSlot::clearPendingNetworkCommandList() {
MutexSafeWrapper safeMutexSlot(&mutexPendingNetworkCommandList,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexPendingNetworkCommandList,CODE_AT_LINE);
if(vctPendingNetworkCommandList.empty() == false) {
vctPendingNetworkCommandList.clear();
}
@ -1112,7 +1134,7 @@ bool ConnectionSlot::hasValidSocketId() {
//bool result = (this->getSocket() != NULL && this->getSocket()->getSocketId() > 0);
//return result;
bool result = false;
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
if(socket != NULL && socket->getSocketId() > 0) {
result = true;
}
@ -1122,7 +1144,7 @@ bool ConnectionSlot::hasValidSocketId() {
bool ConnectionSlot::isConnected() {
bool result = false;
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
if(socket != NULL && socket->isConnected() == true) {
result = true;
}
@ -1131,7 +1153,7 @@ bool ConnectionSlot::isConnected() {
PLATFORM_SOCKET ConnectionSlot::getSocketId() {
PLATFORM_SOCKET result = 0;
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
if(socket != NULL) {
result = socket->getSocketId();
}
@ -1140,7 +1162,7 @@ PLATFORM_SOCKET ConnectionSlot::getSocketId() {
pair<bool,Socket*> ConnectionSlot::getSocketInfo() {
pair<bool,Socket*> result;
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
result.first = (socket != NULL && socket->isConnected());
result.second = socket;
@ -1151,25 +1173,25 @@ pair<bool,Socket*> ConnectionSlot::getSocketInfo() {
Socket* ConnectionSlot::getSocket(bool mutexLock) {
MutexSafeWrapper safeMutexSlot(NULL,CODE_AT_LINE);
if(mutexLock == true) {
safeMutexSlot.setMutex(&mutexSocket,CODE_AT_LINE);
safeMutexSlot.setMutex(mutexSocket,CODE_AT_LINE);
}
return socket;
}
void ConnectionSlot::setSocket(Socket *newSocket) {
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
socket = newSocket;
}
void ConnectionSlot::deleteSocket() {
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
delete socket;
socket = NULL;
}
bool ConnectionSlot::hasDataToRead() {
bool result = false;
MutexSafeWrapper safeMutexSlot(&mutexSocket,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(mutexSocket,CODE_AT_LINE);
if(socket != NULL && socket->hasDataToRead() == true) {
result = true;

View File

@ -75,7 +75,7 @@ protected:
ConnectionSlotCallbackInterface *slotInterface;
Semaphore semTaskSignalled;
Mutex triggerIdMutex;
Mutex *triggerIdMutex;
vector<ConnectionSlotEvent> eventList;
int slotIndex;
@ -88,6 +88,8 @@ protected:
public:
ConnectionSlotThread(int slotIndex);
ConnectionSlotThread(ConnectionSlotCallbackInterface *slotInterface,int slotIndex);
virtual ~ConnectionSlotThread();
virtual void execute();
void signalUpdate(ConnectionSlotEvent *event);
bool isSignalCompleted(ConnectionSlotEvent *event);
@ -106,7 +108,7 @@ class ConnectionSlot: public NetworkInterface {
private:
ServerInterface* serverInterface;
Mutex mutexSocket;
Mutex *mutexSocket;
Socket* socket;
int playerIndex;
string name;
@ -116,9 +118,9 @@ private:
time_t connectedTime;
bool gotIntro;
Mutex mutexCloseConnection;
Mutex *mutexCloseConnection;
Mutex mutexPendingNetworkCommandList;
Mutex *mutexPendingNetworkCommandList;
vector<NetworkCommand> vctPendingNetworkCommandList;
ConnectionSlotThread* slotThreadWorker;
int currentFrameCount;
@ -199,7 +201,7 @@ protected:
Mutex * getServerSynchAccessor();
std::vector<std::string> threadErrorList;
Mutex socketSynchAccessor;
Mutex *socketSynchAccessor;
void setSocket(Socket *newSocket);
void deleteSocket();

View File

@ -402,7 +402,7 @@ void NetworkMessageCommandList::send(Socket* socket) const {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] nmtCommandList, frameCount = %d, data.header.commandCount = %d, data.header.messageType = %d\n",__FILE__,__FUNCTION__,__LINE__,data.header.frameCount,data.header.commandCount,data.header.messageType);
assert(data.header.messageType==nmtCommandList);
int totalMsgSize = commandListHeaderSize + (sizeof(NetworkCommand) * data.header.commandCount);
//int totalMsgSize = commandListHeaderSize + (sizeof(NetworkCommand) * data.header.commandCount);
//NetworkMessage::send(socket, &data, totalMsgSize);
NetworkMessage::send(socket, &data.header, commandListHeaderSize);
if(data.header.commandCount > 0) {

View File

@ -47,6 +47,15 @@ const int MASTERSERVER_HEARTBEAT_GAME_STATUS_SECONDS = 30;
ServerInterface::ServerInterface(bool publishEnabled) :GameNetworkInterface() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
serverSynchAccessor = new Mutex();
for(int i= 0; i < GameConstants::maxPlayers; ++i) {
slotAccessorMutexes[i] = new Mutex();
}
masterServerThreadAccessor = new Mutex();
textMessageQueueThreadAccessor = new Mutex();
broadcastMessageQueueThreadAccessor = new Mutex();
inBroadcastMessageThreadAccessor = new Mutex();
nextEventId = 1;
gameHasBeenInitiated = false;
exitServer = false;
@ -169,7 +178,7 @@ ServerInterface::~ServerInterface() {
exitServer = true;
for(int i= 0; i < GameConstants::maxPlayers; ++i) {
if(slots[i] != NULL) {
MutexSafeWrapper safeMutex(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutex(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
delete slots[i];
slots[i]=NULL;
}
@ -187,7 +196,7 @@ ServerInterface::~ServerInterface() {
delete ftpServer;
ftpServer = NULL;
}
MutexSafeWrapper safeMutex(&masterServerThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(masterServerThreadAccessor,CODE_AT_LINE);
delete publishToMasterserverThread;
publishToMasterserverThread = NULL;
safeMutex.ReleaseLock();
@ -196,6 +205,27 @@ ServerInterface::~ServerInterface() {
if(needToRepublishToMasterserver == true) {
simpleTask(NULL);
}
for(int i= 0; i < GameConstants::maxPlayers; ++i) {
delete slotAccessorMutexes[i];
slotAccessorMutexes[i] = NULL;
}
delete textMessageQueueThreadAccessor;
textMessageQueueThreadAccessor = NULL;
delete broadcastMessageQueueThreadAccessor;
broadcastMessageQueueThreadAccessor = NULL;
delete inBroadcastMessageThreadAccessor;
inBroadcastMessageThreadAccessor = NULL;
delete serverSynchAccessor;
serverSynchAccessor = NULL;
delete masterServerThreadAccessor;
masterServerThreadAccessor = NULL;
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
}
@ -203,7 +233,7 @@ int ServerInterface::isValidClientType(uint32 clientIp) {
int result = 0;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
if(slots[i] != NULL) {
MutexSafeWrapper safeMutex(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutex(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
Socket *socket = slots[i]->getSocket();
if(socket != NULL) {
@ -275,14 +305,14 @@ void ServerInterface::addClientToServerIPAddress(uint32 clientIp, uint32 ServerI
void ServerInterface::addSlot(int playerIndex) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
assert(playerIndex >= 0 && playerIndex < GameConstants::maxPlayers);
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
if(serverSocket.isPortBound() == false) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
serverSocket.bind(serverSocket.getBindPort());
}
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(playerIndex));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(playerIndex));
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
ConnectionSlot *slot = slots[playerIndex];
if(slot != NULL) {
@ -308,9 +338,9 @@ bool ServerInterface::switchSlot(int fromPlayerIndex, int toPlayerIndex) {
return false;
}
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[fromPlayerIndex],CODE_AT_LINE_X(fromPlayerIndex));
MutexSafeWrapper safeMutexSlot2(&slotAccessorMutexes[toPlayerIndex],CODE_AT_LINE_X(toPlayerIndex));
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[fromPlayerIndex],CODE_AT_LINE_X(fromPlayerIndex));
MutexSafeWrapper safeMutexSlot2(slotAccessorMutexes[toPlayerIndex],CODE_AT_LINE_X(toPlayerIndex));
if(slots[toPlayerIndex] != NULL && slots[toPlayerIndex] != NULL &&
slots[toPlayerIndex]->isConnected() == false) {
slots[fromPlayerIndex]->setPlayerIndex(toPlayerIndex);
@ -338,11 +368,11 @@ bool ServerInterface::switchSlot(int fromPlayerIndex, int toPlayerIndex) {
void ServerInterface::removeSlot(int playerIndex, int lockedSlotIndex) {
Lang &lang= Lang::getInstance();
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] playerIndex = %d, lockedSlotIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,playerIndex,lockedSlotIndex);
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(NULL,CODE_AT_LINE_X(playerIndex));
if(playerIndex != lockedSlotIndex) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] playerIndex = %d, lockedSlotIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,playerIndex,lockedSlotIndex);
safeMutexSlot.setMutex(&slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(playerIndex));
safeMutexSlot.setMutex(slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(playerIndex));
}
ConnectionSlot *slot = slots[playerIndex];
bool notifyDisconnect = false;
@ -398,14 +428,14 @@ void ServerInterface::removeSlot(int playerIndex, int lockedSlotIndex) {
}
ConnectionSlot *ServerInterface::getSlot(int playerIndex) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[playerIndex],CODE_AT_LINE_X(i));
ConnectionSlot *result = slots[playerIndex];
return result;
}
bool ServerInterface::isClientConnected(int index) {
bool result = false;
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[index],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[index],CODE_AT_LINE_X(i));
if(slots[index] != NULL && slots[index]->isConnected() == true) {
result = true;
}
@ -426,7 +456,7 @@ bool ServerInterface::hasClientConnection() {
int ServerInterface::getConnectedSlotCount() {
int connectedSlotCount = 0;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
if(slots[i] != NULL) {
++connectedSlotCount;
}
@ -476,7 +506,7 @@ void ServerInterface::slotUpdateTask(ConnectionSlotEvent *event) {
//
// //printf("===> START slot %d [%d][%p] - About to updateSlot\n",event->triggerId,event->eventId,slots[event->triggerId]);
//
// safeMutexSlot.setMutex(&slotAccessorMutexes[event->triggerId],CODE_AT_LINE_X(event->triggerId));
// safeMutexSlot.setMutex(slotAccessorMutexes[event->triggerId],CODE_AT_LINE_X(event->triggerId));
// connectionSlot = slots[event->triggerId];
// }
// else {
@ -708,7 +738,7 @@ bool ServerInterface::signalClientReceiveCommands(ConnectionSlot *connectionSlot
void ServerInterface::updateSocketTriggeredList(std::map<PLATFORM_SOCKET,bool> & socketTriggeredList) {
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL) {
PLATFORM_SOCKET clientSocket = connectionSlot->getSocketId();
@ -721,7 +751,7 @@ void ServerInterface::updateSocketTriggeredList(std::map<PLATFORM_SOCKET,bool> &
void ServerInterface::validateConnectedClients() {
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot = slots[i];
if(connectionSlot != NULL) {
connectionSlot->validateConnection();
@ -734,7 +764,7 @@ void ServerInterface::signalClientsToRecieveData(std::map<PLATFORM_SOCKET,bool>
std::map<int,bool> & mapSlotSignalledList) {
//bool checkForNewClients = true;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot = slots[i];
bool socketTriggered = false;
@ -764,7 +794,7 @@ void ServerInterface::checkForCompletedClients(std::map<int,bool> & mapSlotSigna
//printf("===> START slot %d [%p] - About to checkForCompletedClients\n",i,slots[i]);
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
//printf("===> IN slot %d - About to checkForCompletedClients\n",i);
@ -824,7 +854,7 @@ void ServerInterface::checkForLaggingClients(std::map<int,bool> &mapSlotSignalle
threadsDone = true;
// Examine all threads for completion of delegation
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot = slots[i];
if(connectionSlot != NULL && mapSlotSignalledList[i] == true &&
slotsCompleted.find(i) == slotsCompleted.end()) {
@ -937,7 +967,7 @@ void ServerInterface::checkForLaggingClients(std::map<int,bool> &mapSlotSignalle
void ServerInterface::executeNetworkCommandsFromClients() {
if(gameHasBeenInitiated == true) {
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected() == true) {
vector<NetworkCommand> pendingList = connectionSlot->getPendingNetworkCommandList(true);
@ -954,7 +984,7 @@ void ServerInterface::executeNetworkCommandsFromClients() {
void ServerInterface::dispatchPendingChatMessages(std::vector <string> &errorMsgList) {
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL &&
connectionSlot->getChatTextList(false).empty() == false) {
@ -1284,7 +1314,7 @@ void ServerInterface::waitUntilReady(Checksum *checksum) {
vector<string> waitingForHosts;
allReady= true;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected() == true) {
if(connectionSlot->isReady() == false) {
@ -1363,7 +1393,7 @@ void ServerInterface::waitUntilReady(Checksum *checksum) {
uint32 loadingStatus = nmls_NONE;
//send ready message after, so clients start delayed
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected() == true) {
switch(i) {
@ -1421,7 +1451,7 @@ void ServerInterface::waitUntilReady(Checksum *checksum) {
// send loading status message
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected() == true) {
NetworkMessageLoadingStatus networkMessageLoadingStatus(loadingStatus);
@ -1457,7 +1487,7 @@ void ServerInterface::waitUntilReady(Checksum *checksum) {
try {
//send ready message after, so clients start delayed
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected() == true) {
NetworkMessageReady networkMessageReady(checksum->getSum());
@ -1476,7 +1506,7 @@ void ServerInterface::waitUntilReady(Checksum *checksum) {
}
void ServerInterface::processBroadCastMessageQueue() {
MutexSafeWrapper safeMutexSlot(&broadcastMessageQueueThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(broadcastMessageQueueThreadAccessor,CODE_AT_LINE);
if(broadcastMessageQueue.empty() == false) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] broadcastMessageQueue.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,broadcastMessageQueue.size());
for(int i = 0; i < broadcastMessageQueue.size(); ++i) {
@ -1492,7 +1522,7 @@ void ServerInterface::processBroadCastMessageQueue() {
}
void ServerInterface::queueBroadcastMessage(const NetworkMessage *networkMessage, int excludeSlot) {
MutexSafeWrapper safeMutexSlot(&broadcastMessageQueueThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(broadcastMessageQueueThreadAccessor,CODE_AT_LINE);
pair<const NetworkMessage*,int> item;
item.first = networkMessage;
item.second = excludeSlot;
@ -1500,7 +1530,7 @@ void ServerInterface::queueBroadcastMessage(const NetworkMessage *networkMessage
}
void ServerInterface::processTextMessageQueue() {
MutexSafeWrapper safeMutexSlot(&textMessageQueueThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(textMessageQueueThreadAccessor,CODE_AT_LINE);
if(textMessageQueue.empty() == false) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] textMessageQueue.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,textMessageQueue.size());
for(int i = 0; i < textMessageQueue.size(); ++i) {
@ -1516,7 +1546,7 @@ void ServerInterface::queueTextMessage(const string & text, int teamIndex,
//printf("Line: %d text [%s]\n",__LINE__,text.c_str());
MutexSafeWrapper safeMutexSlot(&textMessageQueueThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlot(textMessageQueueThreadAccessor,CODE_AT_LINE);
TextMessageQueue item;
item.text = text;
item.teamIndex = teamIndex;
@ -1559,7 +1589,7 @@ string ServerInterface::getNetworkStatus() {
Lang &lang = Lang::getInstance();
string str="";
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot* connectionSlot= slots[i];
str+= intToStr(i)+ ": ";
@ -1588,7 +1618,7 @@ bool ServerInterface::launchGame(const GameSettings *gameSettings) {
bool bOkToStart = true;
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot= slots[i];
if(connectionSlot != NULL &&
(connectionSlot->getAllowDownloadDataSynch() == true || connectionSlot->getAllowGameDataSynchCheck() == true) &&
@ -1608,7 +1638,7 @@ bool ServerInterface::launchGame(const GameSettings *gameSettings) {
if(useInGameBlockingClientSockets == true) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
for(int i= 0; i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot= slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected()) {
connectionSlot->getSocket()->setBlock(true);
@ -1627,7 +1657,7 @@ bool ServerInterface::launchGame(const GameSettings *gameSettings) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] needToRepublishToMasterserver = %d\n",__FILE__,__FUNCTION__,__LINE__,needToRepublishToMasterserver);
MutexSafeWrapper safeMutex(&masterServerThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(masterServerThreadAccessor,CODE_AT_LINE);
delete publishToMasterserverThread;
publishToMasterserverThread = NULL;
lastMasterserverHeartbeatTime = 0;
@ -1662,7 +1692,7 @@ bool ServerInterface::launchGame(const GameSettings *gameSettings) {
void ServerInterface::broadcastGameSetup(const GameSettings *gameSettings) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
NetworkMessageLaunch networkMessageLaunch(gameSettings, nmtBroadCastSetup);
broadcastMessage(&networkMessageLaunch);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
@ -1672,7 +1702,7 @@ void ServerInterface::broadcastMessage(const NetworkMessage *networkMessage, int
try {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
MutexSafeWrapper safeMutexSlotBroadCastAccessor(&inBroadcastMessageThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlotBroadCastAccessor(inBroadcastMessageThreadAccessor,CODE_AT_LINE);
if(inBroadcastMessage == true && dynamic_cast<const NetworkMessageText *>(networkMessage) != NULL) {
safeMutexSlotBroadCastAccessor.ReleaseLock();
const NetworkMessageText *txtMsg = dynamic_cast<const NetworkMessageText *>(networkMessage);
@ -1689,7 +1719,7 @@ void ServerInterface::broadcastMessage(const NetworkMessage *networkMessage, int
MutexSafeWrapper safeMutexSlot(NULL,CODE_AT_LINE_X(i));
if(i != lockedSlotIndex) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] i = %d, lockedSlotIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,i,lockedSlotIndex);
safeMutexSlot.setMutex(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
safeMutexSlot.setMutex(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
}
ConnectionSlot* connectionSlot= slots[i];
@ -1724,7 +1754,7 @@ void ServerInterface::broadcastMessage(const NetworkMessage *networkMessage, int
SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] Error [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what());
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] ERROR [%s]\n",__FILE__,__FUNCTION__,__LINE__,ex.what());
MutexSafeWrapper safeMutexSlotBroadCastAccessor(&inBroadcastMessageThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSlotBroadCastAccessor(inBroadcastMessageThreadAccessor,CODE_AT_LINE);
inBroadcastMessage = false;
safeMutexSlotBroadCastAccessor.ReleaseLock();
@ -1737,7 +1767,7 @@ void ServerInterface::broadcastMessageToConnectedClients(const NetworkMessage *n
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__);
try {
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot= slots[i];
if(i != excludeSlot && connectionSlot != NULL) {
@ -1761,7 +1791,7 @@ void ServerInterface::updateListen() {
}
int openSlotCount = 0;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
//MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],intToStr(__LINE__) + "_" + intToStr(i));
//MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],intToStr(__LINE__) + "_" + intToStr(i));
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
if(isSlotOpen == true) {
@ -1774,7 +1804,7 @@ void ServerInterface::updateListen() {
int ServerInterface::getOpenSlotCount() {
int openSlotCount = 0;
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
//MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],intToStr(__LINE__) + "_" + intToStr(i));
//MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],intToStr(__LINE__) + "_" + intToStr(i));
bool isSlotOpen = (slots[i] != NULL && slots[i]->isConnected() == false);
if(isSlotOpen == true) {
@ -1786,7 +1816,7 @@ int ServerInterface::getOpenSlotCount() {
int ServerInterface::getGameSettingsUpdateCount() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] START gameSettingsUpdateCount = %d\n",__FILE__,__FUNCTION__,gameSettingsUpdateCount);
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
int result = gameSettingsUpdateCount;
safeMutex.ReleaseLock();
@ -1795,7 +1825,7 @@ int ServerInterface::getGameSettingsUpdateCount() {
void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool waitForClientAck) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] START gameSettingsUpdateCount = %d, waitForClientAck = %d\n",__FILE__,__FUNCTION__,gameSettingsUpdateCount,waitForClientAck);
MutexSafeWrapper safeMutex(&serverSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(serverSynchAccessor,CODE_AT_LINE);
string mapFile = serverGameSettings->getMap();
if(find(mapFiles.begin(),mapFiles.end(),mapFile) == mapFiles.end()) {
@ -1834,7 +1864,7 @@ void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool wai
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
//printf("===> START slot %d - About to setGameSettings #1\n",i);
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot = slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected()) {
if(connectionSlot->getReceivedNetworkGameStatus() == false) {
@ -1850,7 +1880,7 @@ void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool wai
}
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot = slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected()) {
connectionSlot->setReceivedNetworkGameStatus(false);
@ -1870,7 +1900,7 @@ void ServerInterface::setGameSettings(GameSettings *serverGameSettings, bool wai
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
//printf("===> START slot %d - About to setGameSettings 2\n",i);
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
ConnectionSlot *connectionSlot = slots[i];
if(connectionSlot != NULL && connectionSlot->isConnected()) {
if(connectionSlot->getReceivedNetworkGameStatus() == false) {
@ -1921,7 +1951,7 @@ std::map<string,string> ServerInterface::publishToMasterserver() {
std::map < string, string > publishToServerInfo;
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
for(int i= 0; exitServer == false && i < GameConstants::maxPlayers; ++i) {
MutexSafeWrapper safeMutexSlot(&slotAccessorMutexes[i],CODE_AT_LINE_X(i));
MutexSafeWrapper safeMutexSlot(slotAccessorMutexes[i],CODE_AT_LINE_X(i));
if(slots[i] != NULL) {
slotCountUsed++;
slotCountHumans++;
@ -1955,7 +1985,7 @@ std::map<string,string> ServerInterface::publishToMasterserver() {
}
void ServerInterface::simpleTask(BaseThread *callingThread) {
MutexSafeWrapper safeMutex(&masterServerThreadAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutex(masterServerThreadAccessor,CODE_AT_LINE);
if(difftime(time(NULL),lastMasterserverHeartbeatTime) >= MASTERSERVER_HEARTBEAT_GAME_STATUS_SECONDS) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);

View File

@ -48,13 +48,13 @@ public:
private:
ConnectionSlot* slots[GameConstants::maxPlayers];
Mutex slotAccessorMutexes[GameConstants::maxPlayers];
Mutex *slotAccessorMutexes[GameConstants::maxPlayers];
ServerSocket serverSocket;
bool gameHasBeenInitiated;
int gameSettingsUpdateCount;
SwitchSetupRequest* switchSetupRequests[GameConstants::maxPlayers];
Mutex serverSynchAccessor;
Mutex *serverSynchAccessor;
int currentFrameCount;
time_t gameStartTime;
@ -62,7 +62,7 @@ private:
time_t lastGlobalLagCheckTime;
SimpleTaskThread *publishToMasterserverThread;
Mutex masterServerThreadAccessor;
Mutex *masterServerThreadAccessor;
time_t lastMasterserverHeartbeatTime;
bool needToRepublishToMasterserver;
@ -70,13 +70,13 @@ private:
bool exitServer;
int64 nextEventId;
Mutex textMessageQueueThreadAccessor;
Mutex *textMessageQueueThreadAccessor;
vector<TextMessageQueue> textMessageQueue;
Mutex broadcastMessageQueueThreadAccessor;
Mutex *broadcastMessageQueueThreadAccessor;
vector<pair<const NetworkMessage *,int> > broadcastMessageQueue;
Mutex inBroadcastMessageThreadAccessor;
Mutex *inBroadcastMessageThreadAccessor;
bool inBroadcastMessage;
bool masterserverAdminRequestLaunch;
@ -184,7 +184,7 @@ public:
public:
Mutex *getServerSynchAccessor() {
return &serverSynchAccessor;
return serverSynchAccessor;
}
virtual void simpleTask(BaseThread *callingThread);

View File

@ -213,9 +213,15 @@ void Faction::sortUnitsByCommandGroups() {
// =====================================================
FactionThread::FactionThread(Faction *faction) : BaseThread() {
this->triggerIdMutex = new Mutex();
this->faction = faction;
}
FactionThread::~FactionThread() {
delete triggerIdMutex;
triggerIdMutex = NULL;
}
void FactionThread::setQuitStatus(bool value) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d value = %d\n",__FILE__,__FUNCTION__,__LINE__,value);
@ -230,7 +236,7 @@ void FactionThread::setQuitStatus(bool value) {
void FactionThread::signalPathfinder(int frameIndex) {
if(frameIndex >= 0) {
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&triggerIdMutex,mutexOwnerId);
MutexSafeWrapper safeMutex(triggerIdMutex,mutexOwnerId);
this->frameIndex.first = frameIndex;
this->frameIndex.second = false;
@ -242,7 +248,7 @@ void FactionThread::signalPathfinder(int frameIndex) {
void FactionThread::setTaskCompleted(int frameIndex) {
if(frameIndex >= 0) {
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&triggerIdMutex,mutexOwnerId);
MutexSafeWrapper safeMutex(triggerIdMutex,mutexOwnerId);
if(this->frameIndex.first == frameIndex) {
this->frameIndex.second = true;
}
@ -265,7 +271,7 @@ bool FactionThread::isSignalPathfinderCompleted(int frameIndex) {
return true;
}
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&triggerIdMutex,mutexOwnerId);
MutexSafeWrapper safeMutex(triggerIdMutex,mutexOwnerId);
//bool result = (event != NULL ? event->eventCompleted : true);
bool result = (this->frameIndex.first == frameIndex && this->frameIndex.second == true);
@ -297,7 +303,7 @@ void FactionThread::execute() {
}
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&triggerIdMutex,mutexOwnerId);
MutexSafeWrapper safeMutex(triggerIdMutex,mutexOwnerId);
bool executeTask = (frameIndex.first >= 0);
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] frameIndex = %d this = %p executeTask = %d\n",__FILE__,__FUNCTION__,__LINE__,frameIndex.first, this, executeTask);
@ -309,7 +315,7 @@ void FactionThread::execute() {
World *world = faction->getWorld();
Config &config= Config::getInstance();
//Config &config= Config::getInstance();
//bool sortedUnitsAllowed = config.getBool("AllowGroupedUnitCommands","true");
bool sortedUnitsAllowed = false;
if(sortedUnitsAllowed) {
@ -375,6 +381,7 @@ Faction::Faction() {
teamIndex=0;
startLocationIndex=0;
thisFaction=false;
currentSwitchTeamVoteFactionIndex = -1;
}
Faction::~Faction() {
@ -1574,7 +1581,7 @@ int Faction::getFrameCount() {
const SwitchTeamVote * Faction::getFirstSwitchTeamVote() const {
const SwitchTeamVote *vote = NULL;
if(switchTeamVotes.size() > 0) {
if(switchTeamVotes.empty() == false) {
for(std::map<int,SwitchTeamVote>::const_iterator iterMap = switchTeamVotes.begin();
iterMap != switchTeamVotes.end(); ++iterMap) {
const SwitchTeamVote &curVote = iterMap->second;
@ -1657,6 +1664,64 @@ bool Faction::canCreateUnit(const UnitType *ut, bool checkBuild, bool checkProdu
return foundUnit;
}
uint64 Faction::getCacheKBytes(uint64 *cache1Size, uint64 *cache2Size) {
uint64 cache1Count = 0;
uint64 cache2Count = 0;
//std::map<Vec2i,int> cacheResourceTargetList;
for(std::map<Vec2i,int>::iterator iterMap1 = cacheResourceTargetList.begin();
iterMap1 != cacheResourceTargetList.end(); ++iterMap1) {
cache1Count++;
}
//std::map<Vec2i,bool> cachedCloseResourceTargetLookupList;
for(std::map<Vec2i,bool>::iterator iterMap1 = cachedCloseResourceTargetLookupList.begin();
iterMap1 != cachedCloseResourceTargetLookupList.end(); ++iterMap1) {
cache2Count++;
}
if(cache1Size) {
*cache1Size = cache1Count;
}
if(cache2Size) {
*cache2Size = cache2Count;
}
uint64 totalBytes = cache1Count * sizeof(int);
totalBytes += cache2Count * sizeof(bool);
totalBytes /= 1000;
return totalBytes;
}
string Faction::getCacheStats() {
string result = "";
int cache1Count = 0;
int cache2Count = 0;
//std::map<Vec2i,int> cacheResourceTargetList;
for(std::map<Vec2i,int>::iterator iterMap1 = cacheResourceTargetList.begin();
iterMap1 != cacheResourceTargetList.end(); ++iterMap1) {
cache1Count++;
}
//std::map<Vec2i,bool> cachedCloseResourceTargetLookupList;
for(std::map<Vec2i,bool>::iterator iterMap1 = cachedCloseResourceTargetLookupList.begin();
iterMap1 != cachedCloseResourceTargetLookupList.end(); ++iterMap1) {
cache2Count++;
}
uint64 totalBytes = cache1Count * sizeof(int);
totalBytes += cache2Count * sizeof(bool);
totalBytes /= 1000;
char szBuf[1024]="";
sprintf(szBuf,"cache1Count [%d] cache2Count [%d] total KB: %s",cache1Count,cache2Count,formatNumber(totalBytes).c_str());
result = szBuf;
return result;
}
std::string Faction::toString() const {
std::string result = "";

View File

@ -66,7 +66,7 @@ protected:
Faction *faction;
Semaphore semTaskSignalled;
Mutex triggerIdMutex;
Mutex *triggerIdMutex;
std::pair<int,bool> frameIndex;
virtual void setQuitStatus(bool value);
@ -75,6 +75,7 @@ protected:
public:
FactionThread(Faction *faction);
virtual ~FactionThread();
virtual void execute();
void signalPathfinder(int frameIndex);
bool isSignalPathfinderCompleted(int frameIndex);
@ -250,6 +251,9 @@ public:
bool canCreateUnit(const UnitType *ut, bool checkBuild, bool checkProduce, bool checkMorph) const;
string getCacheStats();
uint64 getCacheKBytes(uint64 *cache1Size, uint64 *cache2Size);
std::string toString() const;
private:

View File

@ -131,7 +131,10 @@ void UnitPathBasic::addToLastPathCache(const Vec2i &path) {
}
}
lastPathCacheQueue.push_back(path);
const bool tryLastPathCache = Config::getInstance().getBool("EnablePathfinderCache","false");
if(tryLastPathCache == true) {
lastPathCacheQueue.push_back(path);
}
}
Vec2i UnitPathBasic::pop(bool removeFrontPos) {
@ -286,6 +289,7 @@ Unit::Unit(int id, UnitPathInterface *unitpath, const Vec2i &pos, const UnitType
Unit::mapMemoryList[this]=true;
#endif
mutexCommands = new Mutex();
changedActiveCommand = false;
lastSynchDataString="";
modelFacing = CardinalDir::NORTH;
@ -339,6 +343,10 @@ Unit::Unit(int id, UnitPathInterface *unitpath, const Vec2i &pos, const UnitType
showUnitParticles = config.getBool("UnitParticles","true");
maxQueuedCommandDisplayCount = config.getInt("MaxQueuedCommandDisplayCount","15");
if(Renderer::getInstance().isMasterserverMode() == true) {
showUnitParticles = false;
}
lastPos= pos;
progress= 0;
lastAnimProgress= 0;
@ -405,7 +413,7 @@ Unit::~Unit() {
//remove commands
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
changedActiveCommand = false;
while(commands.empty() == false) {
@ -459,6 +467,9 @@ Unit::~Unit() {
//MutexSafeWrapper safeMutex1(&mutexDeletedUnits,string(__FILE__) + "_" + intToStr(__LINE__));
//deletedUnits[this]=true;
delete mutexCommands;
mutexCommands=NULL;
#ifdef LEAK_CHECK_UNITS
Unit::mapMemoryList.erase(this);
#endif
@ -1100,7 +1111,7 @@ bool Unit::anyCommand(bool validateCommandtype) const {
//return current command, assert that there is always one command
Command *Unit::getCurrrentCommandThreadSafe() {
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
if(commands.empty() == false) {
return commands.front();
@ -1119,7 +1130,7 @@ Command *Unit::getCurrCommand() const {
void Unit::replaceCurrCommand(Command *cmd) {
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
assert(commands.empty() == false);
commands.front() = cmd;
@ -1191,7 +1202,7 @@ CommandResult Unit::giveCommand(Command *command, bool tryQueue) {
SystemFlags::OutputDebug(SystemFlags::debugUnitCommands,"In [%s::%s Line: %d] Deleting lower priority command [%s]\n",__FILE__,__FUNCTION__,__LINE__,(*i)->toString().c_str());
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
deleteQueuedCommand(*i);
i= commands.erase(i);
@ -1226,7 +1237,7 @@ CommandResult Unit::giveCommand(Command *command, bool tryQueue) {
// clearCommands();
// changedActiveCommand = willChangedActiveCommand;
bool willChangedActiveCommand= (commands.size() > 0);
bool willChangedActiveCommand= (commands.empty() == false);
if(willChangedActiveCommand){
CommandClass currCommandClass=getCurrCommand()->getCommandType()->getClass();
CommandClass commandClass=command->getCommandType()->getClass();
@ -1271,7 +1282,7 @@ CommandResult Unit::giveCommand(Command *command, bool tryQueue) {
//push back command
if(result == crSuccess) {
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
commands.push_back(command);
@ -1300,7 +1311,7 @@ CommandResult Unit::finishCommand() {
//pop front
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
delete commands.front();
commands.erase(commands.begin());
@ -1341,7 +1352,7 @@ CommandResult Unit::cancelCommand() {
//delete ans pop command
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
delete commands.back();
commands.pop_back();
@ -2590,7 +2601,7 @@ void Unit::clearCommands() {
undoCommand(commands.back());
static string mutexOwnerId = string(__FILE__) + string("_") + intToStr(__LINE__);
MutexSafeWrapper safeMutex(&mutexCommands,mutexOwnerId);
MutexSafeWrapper safeMutex(mutexCommands,mutexOwnerId);
delete commands.back();
commands.pop_back();

View File

@ -404,7 +404,7 @@ private:
std::vector<UnitAttackBoostEffect *> currentAttackBoostEffects;
Mutex mutexCommands;
Mutex *mutexCommands;
//static Mutex mutexDeletedUnits;
//static std::map<void *,bool> deletedUnits;

View File

@ -851,7 +851,7 @@ void SwitchTeamCommandType::load(int id, const XmlNode *n, const string &dir,
string SwitchTeamCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{
string str= name+"\n";
Lang &lang= Lang::getInstance();
//Lang &lang= Lang::getInstance();
//prod speed
//str+= lang.get("MorphSpeed")+": "+ intToStr(morphSkillType->getSpeed())+"\n";

View File

@ -29,6 +29,9 @@ private:
int id;
public:
AttackType() {
id = -1;
}
int getId() const {return id;}
const string &getName() const {return name;}
@ -40,12 +43,15 @@ public:
// class ArmorType
// ===============================
class ArmorType{
class ArmorType {
private:
string name;
int id;
public:
ArmorType() {
id = -1;
}
int getId() const {return id;}
const string &getName() const {return name;}

View File

@ -35,7 +35,7 @@ using Shared::Graphics::Vec3f;
typedef vector<ObjectParticleSystemType*> ObjectParticleSystemTypes;
typedef vector<ObjectParticleSystemTypes> ObjectParticleVector;
class ObjectType{
class ObjectType {
private:
typedef vector<TilesetModelType*> ModelTypes;
private:
@ -51,6 +51,11 @@ private:
int height;
public:
ObjectType() {
objectClass = -1;
walkable = false;
height = 0;
}
~ObjectType();
void init(int modelCount, int objectClass, bool walkable, int height);

View File

@ -33,7 +33,7 @@ using Shared::Graphics::Vec3f;
typedef vector<ObjectParticleSystemType*> ModelParticleSystemTypes;
class TilesetModelType{
class TilesetModelType {
private:
Model *model;
ModelParticleSystemTypes particleTypes;
@ -41,6 +41,11 @@ private:
bool rotationAllowed;
public:
TilesetModelType() {
model = NULL;
height = 0;
rotationAllowed = false;
}
~TilesetModelType();
void addParticleSystem(ObjectParticleSystemType *particleSystem);

View File

@ -131,7 +131,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree,
this->id= id;
try {
Lang &lang= Lang::getInstance();
//Lang &lang= Lang::getInstance();
char szBuf[1024]="";
sprintf(szBuf,Lang::getInstance().get("LogScreenGameLoadingUnitType","",true).c_str(),formatString(name).c_str());

View File

@ -46,6 +46,9 @@ private:
int kills;
public:
Level() {
kills = 0;
}
void init(string name, int kills);
const string &getName() const {return name;}

View File

@ -72,6 +72,17 @@ private:
StaticSound nightStart;
public:
AmbientSounds() {
enabledDay = false;
enabledNight = false;
enabledRain = false;
enabledSnow = false;
enabledDayStart = false;
enabledNightStart = false;
alwaysPlayDay = false;
alwaysPlayNight = false;
}
bool isEnabledDay() const {return enabledDay;}
bool isEnabledNight() const {return enabledNight;}
bool isEnabledRain() const {return enabledRain;}
@ -131,6 +142,13 @@ private:
Checksum checksumValue;
public:
Tileset() {
waterTex = NULL;
waterEffects = false;
fog = false;
fogMode = 0;
fogDensity = 0.0f;
}
~Tileset();
Checksum loadTileset(const vector<string> pathList, const string &tilesetName,
Checksum* checksum, std::map<string,vector<pair<string, string> > > &loadedFileList);

View File

@ -29,7 +29,7 @@ using Shared::Sound::StaticSound;
/// Raises time related events (day/night cycle)
// =====================================================
class TimeFlow{
class TimeFlow {
public:
static const float dusk;
static const float dawn;
@ -42,6 +42,13 @@ private:
float timeInc;
public:
TimeFlow() {
firstTime = false;
tileset = NULL;
time = 0.0f;
lastTime = 0.0f;
timeInc = 0.0f;
}
void init(Tileset *tileset);
float getTime() const {return time;}

View File

@ -1277,7 +1277,7 @@ void UnitUpdater::updateHarvest(Unit *unit, int frameIndex) {
if (r->decAmount(1)) {
const ResourceType *rt = r->getType();
sc->deleteResource();
unit->getFaction()->removeResourceTargetFromCache(unitTargetPos);
world->removeResourceTargetFromCache(unitTargetPos);
switch(this->game->getGameSettings()->getPathFinderType()) {
case pfBasic:
@ -2178,26 +2178,28 @@ bool UnitUpdater::findCachedCellsEnemies(Vec2i center, int range, int size, vect
bool result = false;
//return result;
MutexSafeWrapper safeMutex(&mutexUnitRangeCellsLookupItemCache,string(__FILE__) + "_" + intToStr(__LINE__));
std::map<Vec2i, std::map<int, std::map<int, UnitRangeCellsLookupItem > > >::iterator iterFind = UnitRangeCellsLookupItemCache.find(center);
if(game->isMasterserverMode() == false) {
MutexSafeWrapper safeMutex(&mutexUnitRangeCellsLookupItemCache,string(__FILE__) + "_" + intToStr(__LINE__));
std::map<Vec2i, std::map<int, std::map<int, UnitRangeCellsLookupItem > > >::iterator iterFind = UnitRangeCellsLookupItemCache.find(center);
if(iterFind != UnitRangeCellsLookupItemCache.end()) {
std::map<int, std::map<int, UnitRangeCellsLookupItem > >::iterator iterFind3 = iterFind->second.find(size);
if(iterFind3 != iterFind->second.end()) {
std::map<int, UnitRangeCellsLookupItem>::iterator iterFind4 = iterFind3->second.find(range);
if(iterFind4 != iterFind3->second.end()) {
result = true;
if(iterFind != UnitRangeCellsLookupItemCache.end()) {
std::map<int, std::map<int, UnitRangeCellsLookupItem > >::iterator iterFind3 = iterFind->second.find(size);
if(iterFind3 != iterFind->second.end()) {
std::map<int, UnitRangeCellsLookupItem>::iterator iterFind4 = iterFind3->second.find(range);
if(iterFind4 != iterFind3->second.end()) {
result = true;
std::vector<Cell *> &cellList = iterFind4->second.rangeCellList;
for(int idx = 0; idx < cellList.size(); ++idx) {
Cell *cell = cellList[idx];
std::vector<Cell *> &cellList = iterFind4->second.rangeCellList;
for(int idx = 0; idx < cellList.size(); ++idx) {
Cell *cell = cellList[idx];
findEnemiesForCell(ast,cell,unit,commandTarget,enemies);
findEnemiesForCell(ast,cell,unit,commandTarget,enemies);
}
}
}
}
safeMutex.ReleaseLock();
}
safeMutex.ReleaseLock();
return result;
}
@ -2299,7 +2301,7 @@ bool UnitUpdater::unitOnRange(const Unit *unit, int range, Unit **rangedPtr,
}
// Ok update our caches with the latest info
if(cacheItem.rangeCellList.size() > 0) {
if(cacheItem.rangeCellList.empty() == false) {
MutexSafeWrapper safeMutex(&mutexUnitRangeCellsLookupItemCache,string(__FILE__) + "_" + intToStr(__LINE__));
//cacheItem.UnitRangeCellsLookupItemCacheTimerCountIndex = UnitRangeCellsLookupItemCacheTimerCount++;
@ -2483,7 +2485,7 @@ vector<Unit*> UnitUpdater::enemyUnitsOnRange(const Unit *unit,const AttackSkillT
}
// Ok update our caches with the latest info
if(cacheItem.rangeCellList.size() > 0) {
if(cacheItem.rangeCellList.empty() == false) {
MutexSafeWrapper safeMutex(&mutexUnitRangeCellsLookupItemCache,string(__FILE__) + "_" + intToStr(__LINE__));
//cacheItem.UnitRangeCellsLookupItemCacheTimerCountIndex = UnitRangeCellsLookupItemCacheTimerCount++;
@ -2537,6 +2539,41 @@ vector<Unit*> UnitUpdater::findUnitsInRange(const Unit *unit, int radius) {
return units;
}
string UnitUpdater::getUnitRangeCellsLookupItemCacheStats() {
string result = "";
int posCount = 0;
int sizeCount = 0;
int rangeCount = 0;
int rangeCountCellCount = 0;
Mutex mutexUnitRangeCellsLookupItemCache;
//std::map<Vec2i, std::map<int, std::map<int, UnitRangeCellsLookupItem > > > UnitRangeCellsLookupItemCache;
for(std::map<Vec2i, std::map<int, std::map<int, UnitRangeCellsLookupItem > > >::iterator iterMap1 = UnitRangeCellsLookupItemCache.begin();
iterMap1 != UnitRangeCellsLookupItemCache.end(); ++iterMap1) {
posCount++;
for(std::map<int, std::map<int, UnitRangeCellsLookupItem > >::iterator iterMap2 = iterMap1->second.begin();
iterMap2 != iterMap1->second.end(); ++iterMap2) {
sizeCount++;
for(std::map<int, UnitRangeCellsLookupItem>::iterator iterMap3 = iterMap2->second.begin();
iterMap3 != iterMap2->second.end(); ++iterMap3) {
rangeCount++;
rangeCountCellCount += iterMap3->second.rangeCellList.size();
}
}
}
uint64 totalBytes = rangeCountCellCount * sizeof(Cell *);
totalBytes /= 1000;
char szBuf[1024]="";
sprintf(szBuf,"pos [%d] size [%d] range [%d][%d] total KB: %s",posCount,sizeCount,rangeCount,rangeCountCellCount,formatNumber(totalBytes).c_str());
result = szBuf;
return result;
}
// =====================================================
// class ParticleDamager
// =====================================================

View File

@ -126,6 +126,8 @@ public:
void findUnitsForCell(Cell *cell, const Unit *unit,vector<Unit*> &units);
vector<Unit*> findUnitsInRange(const Unit *unit, int radius);
string getUnitRangeCellsLookupItemCacheStats();
private:
//attack
void hit(Unit *attacker);

View File

@ -325,7 +325,7 @@ Checksum World::loadScenario(const string &path, Checksum *checksum, bool resetC
if(resetCurrentScenario == true) {
scenario = Scenario();
scriptManager->init(this, this->getGame()->getGameCamera());
scriptManager->init(this, this->getGame()->getGameCameraPtr());
}
scenarioChecksum = scenario.load(path);
@ -1436,7 +1436,8 @@ void World::exploreCells(const Vec2i &newPos, int sightRange, int teamIndex) {
//bool cacheLookupSightResult = false;
// cache lookup of previously calculated cells + sight range
if(MaxExploredCellsLookupItemCache > 0) {
if(MaxExploredCellsLookupItemCache > 0 && game->isMasterserverMode() == false) {
//if(MaxExploredCellsLookupItemCache > 0) {
if(difftime(time(NULL),ExploredCellsLookupItem::lastDebug) >= 10) {
ExploredCellsLookupItem::lastDebug = time(NULL);
//printf("In [%s::%s Line: %d] ExploredCellsLookupItemCache.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,ExploredCellsLookupItemCache.size());
@ -1540,7 +1541,7 @@ void World::exploreCells(const Vec2i &newPos, int sightRange, int teamIndex) {
// Ok update our caches with the latest info for this position, sight and team
if(MaxExploredCellsLookupItemCache > 0) {
if(item.exploredCellList.size() > 0 || item.visibleCellList.size() > 0) {
if(item.exploredCellList.empty() == false || item.visibleCellList.empty() == false) {
//ExploredCellsLookupItemCache.push_back(item);
item.ExploredCellsLookupItemCacheTimerCountIndex = ExploredCellsLookupItemCacheTimerCount++;
ExploredCellsLookupItemCache[newPos][sightRange] = item;
@ -1701,7 +1702,9 @@ void World::computeFow(int factionIdxToTick) {
}
//compute texture
if(fogOfWar) {
//printf("Masterserver = %d\n",game->isMasterserverMode());
if(fogOfWar == true && game->isMasterserverMode() == false) {
for(int i=0; i<getFactionCount(); ++i) {
Faction *faction= getFaction(i);
if(faction->getTeam() == thisTeamIndex) {
@ -1758,7 +1761,7 @@ void World::computeFow(int factionIdxToTick) {
itemCache.alphaList.push_back(alpha);
}
if(itemCache.surfPosList.size() > 0) {
if(itemCache.surfPosList.empty() == false) {
FowAlphaCellsLookupItemCache[unit->getPos()][sightRange] = itemCache;
}
}
@ -1796,6 +1799,98 @@ int World::getNextCommandGroupId() {
return ++nextCommandGroupId;
}
void World::removeResourceTargetFromCache(const Vec2i &pos) {
for(int i= 0; i < factions.size(); ++i) {
factions[i]->removeResourceTargetFromCache(pos);
}
}
string World::getExploredCellsLookupItemCacheStats() {
string result = "";
int posCount = 0;
int sightCount = 0;
int exploredCellCount = 0;
int visibleCellCount = 0;
//std::map<Vec2i, std::map<int, ExploredCellsLookupItem > > ExploredCellsLookupItemCache;
for(std::map<Vec2i, std::map<int, ExploredCellsLookupItem > >::iterator iterMap1 = ExploredCellsLookupItemCache.begin();
iterMap1 != ExploredCellsLookupItemCache.end(); ++iterMap1) {
posCount++;
for(std::map<int, ExploredCellsLookupItem >::iterator iterMap2 = iterMap1->second.begin();
iterMap2 != iterMap1->second.end(); ++iterMap2) {
sightCount++;
exploredCellCount += iterMap2->second.exploredCellList.size();
visibleCellCount += iterMap2->second.visibleCellList.size();
}
}
uint64 totalBytes = exploredCellCount * sizeof(SurfaceCell *);
totalBytes += visibleCellCount * sizeof(SurfaceCell *);
totalBytes /= 1000;
char szBuf[1024]="";
sprintf(szBuf,"pos [%d] sight [%d] [%d][%d] total KB: %s",posCount,sightCount,exploredCellCount,visibleCellCount,formatNumber(totalBytes).c_str());
result = szBuf;
return result;
}
string World::getFowAlphaCellsLookupItemCacheStats() {
string result = "";
int posCount = 0;
int sightCount = 0;
int surfPosCount = 0;
int alphaListCount = 0;
//std::map<Vec2i, std::map<int, FowAlphaCellsLookupItem > > FowAlphaCellsLookupItemCache;
for(std::map<Vec2i, std::map<int, FowAlphaCellsLookupItem > >::iterator iterMap1 = FowAlphaCellsLookupItemCache.begin();
iterMap1 != FowAlphaCellsLookupItemCache.end(); ++iterMap1) {
posCount++;
for(std::map<int, FowAlphaCellsLookupItem >::iterator iterMap2 = iterMap1->second.begin();
iterMap2 != iterMap1->second.end(); ++iterMap2) {
sightCount++;
surfPosCount += iterMap2->second.surfPosList.size();
alphaListCount += iterMap2->second.alphaList.size();
}
}
uint64 totalBytes = surfPosCount * sizeof(Vec2i);
totalBytes += alphaListCount * sizeof(float);
totalBytes /= 1000;
char szBuf[1024]="";
sprintf(szBuf,"pos [%d] sight [%d] [%d][%d] total KB: %s",posCount,sightCount,surfPosCount,alphaListCount,formatNumber(totalBytes).c_str());
result = szBuf;
return result;
}
string World::getAllFactionsCacheStats() {
string result = "";
uint64 totalBytes = 0;
uint64 totalCache1Size = 0;
uint64 totalCache2Size = 0;
for(int i = 0; i < getFactionCount(); ++i) {
uint64 cache1Size = 0;
uint64 cache2Size = 0;
totalBytes += getFaction(i)->getCacheKBytes(&cache1Size, &cache2Size);
totalCache1Size += cache1Size;
totalCache2Size += cache2Size;
}
char szBuf[1024]="";
sprintf(szBuf,"totalCache1Size [%lu] totalCache1Size [%lu] total KB: %s",totalCache1Size,totalCache2Size,formatNumber(totalBytes).c_str());
result = szBuf;
return result;
}
std::string World::DumpWorldToLog(bool consoleBasicInfoOnly) const {
string debugWorldLogFile = Config::getInstance().getString("DebugWorldLogFile","debugWorld.log");

View File

@ -82,7 +82,7 @@ public:
static time_t lastDebug;
};
class World{
class World {
private:
typedef vector<Faction *> Factions;
@ -258,6 +258,12 @@ public:
UnitUpdater * getUnitUpdater() { return &unitUpdater; }
void removeResourceTargetFromCache(const Vec2i &pos);
string getExploredCellsLookupItemCacheStats();
string getFowAlphaCellsLookupItemCacheStats();
string getAllFactionsCacheStats();
private:
void initCells(bool fogOfWar);

View File

@ -120,10 +120,10 @@ protected:
time_t lastThreadedPing;
//Mutex pingThreadAccessor;
Mutex dataSynchAccessorRead;
Mutex dataSynchAccessorWrite;
Mutex *dataSynchAccessorRead;
Mutex *dataSynchAccessorWrite;
Mutex inSocketDestructorSynchAccessor;
Mutex *inSocketDestructorSynchAccessor;
bool inSocketDestructor;
public:
@ -214,7 +214,7 @@ protected:
class BroadCastSocketThread : public BaseThread
{
private:
Mutex mutexPauseBroadcast;
Mutex *mutexPauseBroadcast;
bool pauseBroadcast;
public:

View File

@ -38,6 +38,8 @@ string doubleToStr(double f,int precsion=2);
bool IsNumeric(const char *p, bool allowNegative=true);
string formatNumber(uint64 f);
}}//end namespace
#endif

View File

@ -119,13 +119,14 @@ int ftpCreateAccount(const char* name, const char* passw, const char* root, int
*/
int ftpFindAccount(const char* name)
{
int n;
if(name[0] != '\0')
for(n = 0; n < MAX_USERS; n++)
if(!strncmp(ftpUsers[n].name, name, MAXLEN_USERNAME))
if(name[0] != '\0') {
int n;
for(n = 0; n < MAX_USERS; n++) {
if(!strncmp(ftpUsers[n].name, name, MAXLEN_USERNAME)) {
return n + 1;
}
}
}
return 0;
}

View File

@ -276,7 +276,6 @@ LOCAL int ftpCmdAbor(int sessionId, const char* args, int len)
#define MLSD 8
LOCAL int sendListing(socket_t dataSocket, int sessionId, const char* path, int format)
{
int haveAnySuccessfulFiles = 0;
void *dir;
const char monName[12][4] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
@ -286,11 +285,12 @@ LOCAL int sendListing(socket_t dataSocket, int sessionId, const char* path, int
dir = ftpOpenDir(path);
if(dir)
{
const char* dirEntry;
int len;
const char* dirEntry = NULL;
int len = 0;
int err = 0;
ftpTime_S currTime = {0};
ftpPathInfo_S fileInfo;
int haveAnySuccessfulFiles = 0;
ftpGetLocalTime(&currTime);
ftpSendMsg(MSG_NORMAL, sessionId, 150, ftpMsg010);
@ -1023,7 +1023,6 @@ void ftpParseCmd(int sessionId)
{
ftpSession_S *pSession;
int len;
int c;
socket_t ctrlSocket;
pSession = ftpGetSession(sessionId);
@ -1033,6 +1032,7 @@ void ftpParseCmd(int sessionId)
if((pSession->rxBuf[len - 1] == '\n') &&
(pSession->rxBuf[len - 2] == '\r') ) // command correctly terminated?
{
int c = 0;
pSession->rxBuf[len - 2] = '\0';
pSession->rxBufWriteIdx = 0;

View File

@ -548,8 +548,8 @@ int getLastSocketError() {
const char * getLastSocketErrorText(int *errNumber) {
int errId = (errNumber != NULL ? *errNumber : getLastSocketError());
//return WSAGetLastErrorMessage("",errId);
return "?";
return WSAGetLastErrorMessage("",errId);
//return "?";
}
#endif

View File

@ -68,7 +68,8 @@ void TextFreetypeGL::init(string fontName, int fontSize) {
this->font = texture_font_new( atlas, fontFile, (float)fontFaceSize );
//font = texture_font_new( atlas, font_manager_match_description( 0, "Verdana", minsize, bold, italic ), minsize );
int missed = texture_font_cache_glyphs( font, cache );
//int missed = texture_font_cache_glyphs( font, cache );
texture_font_cache_glyphs( font, cache );
free((void*)this->fontFile);
this->fontFile = NULL;
@ -113,7 +114,7 @@ void TextFreetypeGL::Render(const char* str, const int len) {
for(int i = 0; (len < 0 && *ustr) || (len >= 0 && i < len); i++) {
unsigned int prevChar = (i > 0 ? *ustr-1 : 0);
unsigned int thisChar = *ustr++;
unsigned int nextChar = *ustr;
//unsigned int nextChar = *ustr;
// Get glyph (build it if needed
TextureGlyph *glyph = texture_font_get_glyph( this->font, thisChar );

View File

@ -1037,7 +1037,7 @@ Md5Model::Md5Model (const string &filename)
while (!ifs.eof ())
{
string token, buffer;
int version;
int version = 0;
// Read next token
ifs >> token;
@ -1377,8 +1377,8 @@ Md5Animation::Md5Animation (const string &filename)
while (!ifs.eof ())
{
string token, buffer;
int version;
int i;
int version = 0;;
int i = 0;
// Read next token
ifs >> token;

View File

@ -717,7 +717,7 @@ void MapPreview::loadFromFile(const string &path) {
#else
FILE *f1 = fopen(path.c_str(), "rb");
#endif
int fileErrno = errno;
//int fileErrno = errno;
if (f1 != NULL) {
//read header

View File

@ -202,12 +202,12 @@ void FileCRCPreCacheThread::execute() {
string &techPath = techDataPaths[idx];
endPathWithSlash(techPath);
findAll(techPath + techName + "/factions/*.", results, false, false);
if(results.size() > 0) {
if(results.empty() == false) {
break;
}
}
if(results.size() == 0) {
if(results.empty() == true) {
for(unsigned int factionIdx = 0; factionIdx < results.size(); ++factionIdx) {
string factionName = results[factionIdx];
int32 factionCRC = 0;

View File

@ -76,6 +76,7 @@ getHTTPResponse(int s, int * size)
int chunksize_buf_index;
header_buf = malloc(header_buf_len);
header_buf[0] = '\0';
content_buf = malloc(content_buf_len);
chunksize_buf[0] = '\0';
chunksize_buf_index = 0;

View File

@ -785,15 +785,19 @@ bool Socket::isSocketValid(const PLATFORM_SOCKET *validateSocket) {
}
Socket::Socket(PLATFORM_SOCKET sock) {
MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE);
inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
dataSynchAccessorRead = new Mutex();
dataSynchAccessorWrite = new Mutex();
inSocketDestructorSynchAccessor = new Mutex();
MutexSafeWrapper safeMutexSocketDestructorFlag(inSocketDestructorSynchAccessor,CODE_AT_LINE);
inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
this->inSocketDestructor = false;
//safeMutexSocketDestructorFlag.ReleaseLock();
//this->pingThread = NULL;
//pingThreadAccessor.setOwnerId(CODE_AT_LINE);
dataSynchAccessorRead.setOwnerId(CODE_AT_LINE);
dataSynchAccessorWrite.setOwnerId(CODE_AT_LINE);
dataSynchAccessorRead->setOwnerId(CODE_AT_LINE);
dataSynchAccessorWrite->setOwnerId(CODE_AT_LINE);
@ -802,8 +806,12 @@ Socket::Socket(PLATFORM_SOCKET sock) {
}
Socket::Socket() {
MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE);
inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
dataSynchAccessorRead = new Mutex();
dataSynchAccessorWrite = new Mutex();
inSocketDestructorSynchAccessor = new Mutex();
MutexSafeWrapper safeMutexSocketDestructorFlag(inSocketDestructorSynchAccessor,CODE_AT_LINE);
inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
this->inSocketDestructor = false;
//safeMutexSocketDestructorFlag.ReleaseLock();
@ -906,12 +914,12 @@ void Socket::simpleTask(BaseThread *callingThread) {
*/
Socket::~Socket() {
MutexSafeWrapper safeMutexSocketDestructorFlag(&inSocketDestructorSynchAccessor,CODE_AT_LINE);
MutexSafeWrapper safeMutexSocketDestructorFlag(inSocketDestructorSynchAccessor,CODE_AT_LINE);
if(this->inSocketDestructor == true) {
SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
return;
}
inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
this->inSocketDestructor = true;
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] START closing socket = %d...\n",__FILE__,__FUNCTION__,sock);
@ -922,9 +930,10 @@ Socket::~Socket() {
// Allow other callers with a lock on the mutexes to let them go
for(time_t elapsed = time(NULL);
(dataSynchAccessorRead.getRefCount() > 0 ||
dataSynchAccessorWrite.getRefCount() > 0) &&
difftime(time(NULL),elapsed) <= 5;) {
(dataSynchAccessorRead->getRefCount() > 0 ||
dataSynchAccessorWrite->getRefCount() > 0) &&
difftime(time(NULL),elapsed) <= 2;) {
printf("Waiting in socket destructor\n");
//sleep(0);
}
@ -933,6 +942,13 @@ Socket::~Socket() {
//delete pingThread;
//pingThread = NULL;
safeMutexSocketDestructorFlag.ReleaseLock();
delete dataSynchAccessorRead;
dataSynchAccessorRead = NULL;
delete dataSynchAccessorWrite;
dataSynchAccessorWrite = NULL;
delete inSocketDestructorSynchAccessor;
inSocketDestructorSynchAccessor = NULL;
}
void Socket::disconnectSocket() {
@ -941,8 +957,8 @@ void Socket::disconnectSocket() {
if(isSocketValid() == true) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] calling shutdown and close for socket = %d...\n",__FILE__,__FUNCTION__,sock);
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex1(&dataSynchAccessorWrite,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex1(dataSynchAccessorWrite,CODE_AT_LINE);
::shutdown(sock,2);
#ifndef WIN32
::close(sock);
@ -1180,10 +1196,10 @@ int Socket::send(const void *data, int dataSize) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(&dataSynchAccessorWrite,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorWrite,CODE_AT_LINE);
#ifdef __APPLE__
bytesSent = ::send(sock, (const char *)data, dataSize, SO_NOSIGPIPE);
@ -1218,10 +1234,10 @@ int Socket::send(const void *data, int dataSize) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(&dataSynchAccessorWrite,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorWrite,CODE_AT_LINE);
#ifdef __APPLE__
bytesSent = ::send(sock, (const char *)data, dataSize, SO_NOSIGPIPE);
#else
@ -1267,10 +1283,10 @@ int Socket::send(const void *data, int dataSize) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(&dataSynchAccessorWrite,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorWrite,CODE_AT_LINE);
const char *sendBuf = (const char *)data;
#ifdef __APPLE__
bytesSent = ::send(sock, &sendBuf[totalBytesSent], dataSize - totalBytesSent, SO_NOSIGPIPE);
@ -1332,10 +1348,10 @@ int Socket::receive(void *data, int dataSize, bool tryReceiveUntilDataSizeMet) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
bytesReceived = recv(sock, reinterpret_cast<char*>(data), dataSize, 0);
safeMutex.ReleaseLock();
}
@ -1361,10 +1377,10 @@ int Socket::receive(void *data, int dataSize, bool tryReceiveUntilDataSizeMet) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
bytesReceived = recv(sock, reinterpret_cast<char*>(data), dataSize, 0);
safeMutex.ReleaseLock();
@ -1410,7 +1426,7 @@ int Socket::peek(void *data, int dataSize,bool mustGetData) {
const int MAX_PEEK_WAIT_SECONDS = 3;
ssize_t err = 0;
int err = 0;
if(isSocketValid() == true) {
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
@ -1419,17 +1435,19 @@ int Socket::peek(void *data, int dataSize,bool mustGetData) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
//MutexSafeWrapper safeMutex(&dataSynchAccessor,CODE_AT_LINE + "_" + intToStr(sock) + "_" + intToStr(dataSize));
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
safeMutex.ReleaseLock();
//printf("Peek #1 err = %d\n",err);
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) if(chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
}
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
@ -1441,6 +1459,8 @@ int Socket::peek(void *data, int dataSize,bool mustGetData) {
else if(err < 0 && getLastSocketError() == PLATFORM_SOCKET_TRY_AGAIN && mustGetData == true) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] #1 ERROR EAGAIN during peek, trying again...\n",__FILE__,__FUNCTION__,__LINE__);
//printf("Peek #2 err = %d\n",err);
time_t tStartTimer = time(NULL);
while((err < 0 && getLastSocketError() == PLATFORM_SOCKET_TRY_AGAIN) &&
(difftime(time(NULL),tStartTimer) <= MAX_PEEK_WAIT_SECONDS)) {
@ -1458,11 +1478,11 @@ int Socket::peek(void *data, int dataSize,bool mustGetData) {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return -1;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
// safeMutexSocketDestructorFlag.ReleaseLock();
//MutexSafeWrapper safeMutex(&dataSynchAccessor,CODE_AT_LINE + "_" + intToStr(sock) + "_" + intToStr(dataSize));
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
err = recv(sock, reinterpret_cast<char*>(data), dataSize, MSG_PEEK);
safeMutex.ReleaseLock();
@ -1477,6 +1497,7 @@ int Socket::peek(void *data, int dataSize,bool mustGetData) {
//if(chrono.getMillis() > 1) printf("In [%s::%s Line: %d] action running for msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis());
if(err <= 0) {
//printf("Peek #3 err = %d\n",err);
if(mustGetData == true || getLastSocketError() != PLATFORM_SOCKET_TRY_AGAIN) {
int iErr = getLastSocketError();
disconnectSocket();
@ -1537,7 +1558,7 @@ bool Socket::isReadable() {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return false;
//}
//inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
//inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
//safeMutexSocketDestructorFlag.ReleaseLock();
//MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
@ -1574,7 +1595,7 @@ bool Socket::isWritable() {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return false;
//}
//inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
//inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
//safeMutexSocketDestructorFlag.ReleaseLock();
//MutexSafeWrapper safeMutex(&dataSynchAccessorWrite,CODE_AT_LINE);
@ -1607,7 +1628,7 @@ bool Socket::isConnected() {
// SystemFlags::OutputDebug(SystemFlags::debugError,"In [%s::%s Line: %d] this->inSocketDestructor == true\n",__FILE__,__FUNCTION__,__LINE__);
// return false;
// }
// inSocketDestructorSynchAccessor.setOwnerId(CODE_AT_LINE);
// inSocketDestructorSynchAccessor->setOwnerId(CODE_AT_LINE);
//if the socket is not writable then it is not conencted
if(isWritable() == false) {
@ -1618,9 +1639,10 @@ bool Socket::isConnected() {
if(isReadable()) {
char tmp=0;
int err = peek(&tmp, 1, false);
if(err <= 0 && err != PLATFORM_SOCKET_TRY_AGAIN) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"[%s::%s Line: %d] ERROR Peek failed, err = %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,err,getLastSocketErrorFormattedText().c_str());
if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugError,"SOCKET DISCONNECTED In [%s::%s Line: %d] ERROR Peek failed, err = %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,err,getLastSocketErrorFormattedText().c_str());
//if(err <= 0 && err != PLATFORM_SOCKET_TRY_AGAIN) {
if(err <= 0) {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"[%s::%s Line: %d] ERROR Peek failed, err = %d for socket: %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,err,sock,getLastSocketErrorFormattedText().c_str());
if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugError,"SOCKET DISCONNECTED In [%s::%s Line: %d] ERROR Peek failed, err = %d for socket: %d, error = %s\n",__FILE__,__FUNCTION__,__LINE__,err,sock,getLastSocketErrorFormattedText().c_str());
return false;
}
}
@ -1757,7 +1779,7 @@ void ClientSocket::connect(const Ip &ip, int port)
FD_SET(sock, &myset);
{
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
err = select((int)sock + 1, NULL, &myset, NULL, &tv);
//safeMutex.ReleaseLock();
}
@ -2175,7 +2197,7 @@ Socket *ServerSocket::accept() {
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
char client_host[100]="";
MutexSafeWrapper safeMutex(&dataSynchAccessorRead,CODE_AT_LINE);
MutexSafeWrapper safeMutex(dataSynchAccessorRead,CODE_AT_LINE);
PLATFORM_SOCKET newSock= ::accept(sock, (struct sockaddr *) &cli_addr, &clilen);
safeMutex.ReleaseLock();
@ -2549,23 +2571,27 @@ void UPNP_Tools::NETremRedirects(int ext_port) {
//
BroadCastSocketThread::BroadCastSocketThread() : BaseThread() {
if(SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled) SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
mutexPauseBroadcast = new Mutex();
setPauseBroadcast(false);
//printf("new broadcast thread [%p]\n",this);
}
BroadCastSocketThread::~BroadCastSocketThread() {
//printf("delete broadcast thread [%p]\n",this);
delete mutexPauseBroadcast;
mutexPauseBroadcast = NULL;
}
bool BroadCastSocketThread::getPauseBroadcast() {
MutexSafeWrapper safeMutexSocketDestructorFlag(&mutexPauseBroadcast,CODE_AT_LINE);
mutexPauseBroadcast.setOwnerId(CODE_AT_LINE);
MutexSafeWrapper safeMutexSocketDestructorFlag(mutexPauseBroadcast,CODE_AT_LINE);
mutexPauseBroadcast->setOwnerId(CODE_AT_LINE);
return pauseBroadcast;
}
void BroadCastSocketThread::setPauseBroadcast(bool value) {
MutexSafeWrapper safeMutexSocketDestructorFlag(&mutexPauseBroadcast,CODE_AT_LINE);
mutexPauseBroadcast.setOwnerId(CODE_AT_LINE);
MutexSafeWrapper safeMutexSocketDestructorFlag(mutexPauseBroadcast,CODE_AT_LINE);
mutexPauseBroadcast->setOwnerId(CODE_AT_LINE);
pauseBroadcast = value;
}
@ -2592,7 +2618,7 @@ void BroadCastSocketThread::execute() {
short port=0; // The port for the broadcast.
struct sockaddr_in bcLocal[MAX_NIC_COUNT]; // local socket address for the broadcast.
PLATFORM_SOCKET bcfd[MAX_NIC_COUNT]; // The socket used for the broadcast.
bool one = true; // Parameter for "setscokopt".
int one = 1; // Parameter for "setscokopt".
int pn=0; // The number of the packet broadcasted.
const int buffMaxSize=1024;
char buff[buffMaxSize]=""; // Buffers the data to be broadcasted.

View File

@ -94,29 +94,38 @@ void Thread::resume() {
class SDLMutexSafeWrapper {
protected:
SDL_mutex *mutex;
SDL_mutex **mutex;
bool destroyMutexInDestructor;
public:
SDLMutexSafeWrapper(SDL_mutex *mutex) {
SDLMutexSafeWrapper(SDL_mutex **mutex, bool destroyMutexInDestructor=false) {
this->mutex = mutex;
this->destroyMutexInDestructor = destroyMutexInDestructor;
Lock();
}
~SDLMutexSafeWrapper() {
ReleaseLock();
bool keepMutex = (this->destroyMutexInDestructor == true && mutex != NULL && *mutex != NULL);
ReleaseLock(keepMutex);
if(this->destroyMutexInDestructor == true && mutex != NULL && *mutex != NULL) {
SDL_DestroyMutex(*mutex);
*mutex = NULL;
mutex = NULL;
}
}
void Lock() {
if(this->mutex != NULL) {
SDL_mutexP(this->mutex);
if(mutex != NULL && *mutex != NULL) {
SDL_mutexP(*mutex);
}
}
void ReleaseLock(bool keepMutex=false) {
if(this->mutex != NULL) {
SDL_mutexV(this->mutex);
if(mutex != NULL && *mutex != NULL) {
SDL_mutexV(*mutex);
if(keepMutex == false) {
this->mutex = NULL;
mutex = NULL;
}
}
}
@ -124,7 +133,7 @@ public:
Mutex::Mutex(string ownerId) {
mutexAccessor = SDL_CreateMutex();
SDLMutexSafeWrapper safeMutex(mutexAccessor);
SDLMutexSafeWrapper safeMutex(&mutexAccessor);
refCount=0;
this->ownerId = ownerId;
mutex = SDL_CreateMutex();
@ -138,7 +147,7 @@ Mutex::Mutex(string ownerId) {
}
Mutex::~Mutex() {
SDLMutexSafeWrapper safeMutex(mutexAccessor);
SDLMutexSafeWrapper safeMutex(&mutexAccessor,true);
if(mutex == NULL) {
char szBuf[1024]="";
snprintf(szBuf,1023,"In [%s::%s Line: %d] mutex == NULL refCount = %d owner [%s] deleteownerId [%s]",__FILE__,__FUNCTION__,__LINE__,refCount,ownerId.c_str(),deleteownerId.c_str());

View File

@ -15,6 +15,9 @@
#include <cstdio>
#include <cstdlib>
#include "platform_common.h"
#include <sstream>
#include <iostream>
#include <locale>
#include "leak_dumper.h"
using namespace std;
@ -145,4 +148,21 @@ bool IsNumeric(const char *p, bool allowNegative) {
return true;
}
class Comma: public numpunct<char>// own facet class
{
protected:
char do_thousands_sep() const { return ','; }// use the comma
string do_grouping() const { return "\3"; }//group 3 digits
};
string formatNumber(uint64 f) {
locale myloc( locale(), // C++ default locale
new Comma);// Own numeric facet
ostringstream out;
out.imbue(myloc);
out << f;
return out.str();
}
}}//end namespace