mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-14 02:33:51 +02:00
* partially done checking memory limit for AIs
This commit is contained in:
parent
b18cbcbda7
commit
696f85a2ed
@ -1 +1 @@
|
|||||||
SUBDIRS = StupidAI EmptyAI GeniusAI MadAI
|
SUBDIRS = StupidAI EmptyAI GeniusAI
|
||||||
|
@ -233,7 +233,7 @@ target_alias = @target_alias@
|
|||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
SUBDIRS = StupidAI EmptyAI GeniusAI MadAI
|
SUBDIRS = StupidAI EmptyAI GeniusAI
|
||||||
all: all-recursive
|
all: all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
3
configure
vendored
3
configure
vendored
@ -16468,7 +16468,7 @@ VCMI_AI_LIBS_DIR="$libdir/vcmi/AI"
|
|||||||
VCMI_SCRIPTING_LIBS_DIR="$libdir/vcmi/Scripting"
|
VCMI_SCRIPTING_LIBS_DIR="$libdir/vcmi/Scripting"
|
||||||
|
|
||||||
|
|
||||||
ac_config_files="$ac_config_files Makefile lib/Makefile client/Makefile server/Makefile AI/Makefile AI/StupidAI/Makefile AI/GeniusAI/Makefile AI/EmptyAI/Makefile AI/MadAI/Makefile Scripting/ERM/Makefile Odpalarka/Makefile VCMI_BattleAiHost/Makefile"
|
ac_config_files="$ac_config_files Makefile lib/Makefile client/Makefile server/Makefile AI/Makefile AI/StupidAI/Makefile AI/GeniusAI/Makefile AI/EmptyAI/Makefile Scripting/ERM/Makefile Odpalarka/Makefile VCMI_BattleAiHost/Makefile"
|
||||||
|
|
||||||
cat >confcache <<\_ACEOF
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# This file is a shell script that caches the results of configure
|
||||||
@ -17570,7 +17570,6 @@ do
|
|||||||
"AI/StupidAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/StupidAI/Makefile" ;;
|
"AI/StupidAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/StupidAI/Makefile" ;;
|
||||||
"AI/GeniusAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/GeniusAI/Makefile" ;;
|
"AI/GeniusAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/GeniusAI/Makefile" ;;
|
||||||
"AI/EmptyAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/EmptyAI/Makefile" ;;
|
"AI/EmptyAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/EmptyAI/Makefile" ;;
|
||||||
"AI/MadAI/Makefile") CONFIG_FILES="$CONFIG_FILES AI/MadAI/Makefile" ;;
|
|
||||||
"Scripting/ERM/Makefile") CONFIG_FILES="$CONFIG_FILES Scripting/ERM/Makefile" ;;
|
"Scripting/ERM/Makefile") CONFIG_FILES="$CONFIG_FILES Scripting/ERM/Makefile" ;;
|
||||||
"Odpalarka/Makefile") CONFIG_FILES="$CONFIG_FILES Odpalarka/Makefile" ;;
|
"Odpalarka/Makefile") CONFIG_FILES="$CONFIG_FILES Odpalarka/Makefile" ;;
|
||||||
"VCMI_BattleAiHost/Makefile") CONFIG_FILES="$CONFIG_FILES VCMI_BattleAiHost/Makefile" ;;
|
"VCMI_BattleAiHost/Makefile") CONFIG_FILES="$CONFIG_FILES VCMI_BattleAiHost/Makefile" ;;
|
||||||
|
@ -122,4 +122,4 @@ AC_SUBST(VCMI_AI_LIBS_DIR)
|
|||||||
VCMI_SCRIPTING_LIBS_DIR="$libdir/vcmi/Scripting"
|
VCMI_SCRIPTING_LIBS_DIR="$libdir/vcmi/Scripting"
|
||||||
AC_SUBST(VCMI_SCRIPTING_LIBS_DIR)
|
AC_SUBST(VCMI_SCRIPTING_LIBS_DIR)
|
||||||
|
|
||||||
AC_OUTPUT(Makefile lib/Makefile client/Makefile server/Makefile AI/Makefile AI/StupidAI/Makefile AI/GeniusAI/Makefile AI/EmptyAI/Makefile AI/MadAI/Makefile Scripting/ERM/Makefile Odpalarka/Makefile VCMI_BattleAiHost/Makefile)
|
AC_OUTPUT(Makefile lib/Makefile client/Makefile server/Makefile AI/Makefile AI/StupidAI/Makefile AI/GeniusAI/Makefile AI/EmptyAI/Makefile Scripting/ERM/Makefile Odpalarka/Makefile VCMI_BattleAiHost/Makefile)
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "../lib/VCMIDirs.h"
|
#include "../lib/VCMIDirs.h"
|
||||||
#include "CGameHandler.h"
|
#include "CGameHandler.h"
|
||||||
#include "../lib/CMapInfo.h"
|
#include "../lib/CMapInfo.h"
|
||||||
|
#include "../lib/CondSh.h"
|
||||||
|
|
||||||
std::string NAME_AFFIX = "server";
|
std::string NAME_AFFIX = "server";
|
||||||
std::string NAME = NAME_VER + std::string(" (") + NAME_AFFIX + ')'; //application name
|
std::string NAME = NAME_VER + std::string(" (") + NAME_AFFIX + ')'; //application name
|
||||||
@ -498,6 +499,52 @@ void CVCMIServer::loadGame()
|
|||||||
gh.run(true);
|
gh.run(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//memory monitoring
|
||||||
|
CondSh<bool> testMem;
|
||||||
|
|
||||||
|
volatile int monitringRes; //0 -- left AI violated mem limit; 1 -- right AI violated mem limit; 2 -- no mem limit violation;
|
||||||
|
|
||||||
|
bool memViolated(const int pid, const int refpid, const int limit) {
|
||||||
|
char call[1000], c2[1000];
|
||||||
|
//sprintf(call, "if (( `cat /proc/%d/statm | cut -d' ' -f1` > `cat /proc/%d/statm | cut -d' ' -f1` + %d )); then cat /kle; else echo b; fi;", pid, refpid, limit);
|
||||||
|
sprintf(call, "/proc/%d/statm", pid);
|
||||||
|
sprintf(c2, "/proc/%d/statm", refpid);
|
||||||
|
std::ifstream proc(call),
|
||||||
|
ref(c2);
|
||||||
|
int procUsage, refUsage;
|
||||||
|
proc >> procUsage;
|
||||||
|
ref >> refUsage;
|
||||||
|
|
||||||
|
return procUsage > refUsage + limit;
|
||||||
|
//return 0 != ::system(call);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memoryMonitor(int lAIpid, int rAIpid, int refPid) {
|
||||||
|
const int MAX_MEM = 20000; //in blocks (of, I hope, 4096 B)
|
||||||
|
monitringRes = 2;
|
||||||
|
tlog0 << "Monitor is activated\n";
|
||||||
|
try {
|
||||||
|
while(testMem.get()) {
|
||||||
|
tlog0 << "Monitor is active 12\n";
|
||||||
|
if(memViolated(lAIpid, refPid, MAX_MEM)) {
|
||||||
|
monitringRes = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(memViolated(rAIpid, refPid, MAX_MEM)) {
|
||||||
|
monitringRes = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(3);
|
||||||
|
tlog0 << "Monitor is active 34\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(...) {
|
||||||
|
tlog0 << "Monitor is throwing something...\n";
|
||||||
|
}
|
||||||
|
tlog0 << "Monitor is closing\n";
|
||||||
|
}
|
||||||
|
////
|
||||||
|
|
||||||
void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI, const std::string &rightAI, int howManyClients)
|
void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI, const std::string &rightAI, int howManyClients)
|
||||||
{
|
{
|
||||||
std::map<CConnection *, si32> pidsFromConns;
|
std::map<CConnection *, si32> pidsFromConns;
|
||||||
@ -588,6 +635,8 @@ void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO monitor memory of PIDs
|
//TODO monitor memory of PIDs
|
||||||
|
testMem.set(true);
|
||||||
|
boost::thread* memMon = new boost::thread(boost::bind(memoryMonitor, PIDs[0], PIDs[1], PIDs[2]));
|
||||||
|
|
||||||
std::string logFName = "duel_log.vdat";
|
std::string logFName = "duel_log.vdat";
|
||||||
tlog0 << "Logging battle activities (for replay possibility) in " << logFName << std::endl;
|
tlog0 << "Logging battle activities (for replay possibility) in " << logFName << std::endl;
|
||||||
@ -599,11 +648,17 @@ void CVCMIServer::startDuel(const std::string &battle, const std::string &leftAI
|
|||||||
gh->runBattle();
|
gh->runBattle();
|
||||||
tlog0 << "Battle over!\n";
|
tlog0 << "Battle over!\n";
|
||||||
tlog0 << "Waiting for connections to close\n";
|
tlog0 << "Waiting for connections to close\n";
|
||||||
|
|
||||||
|
testMem.set(false);
|
||||||
|
memMon->join();
|
||||||
|
delNull(memMon);
|
||||||
|
tlog0 << "Memory violation checking result: " << monitringRes << std::endl;
|
||||||
BOOST_FOREACH(boost::thread *t, threads)
|
BOOST_FOREACH(boost::thread *t, threads)
|
||||||
{
|
{
|
||||||
t->join();
|
t->join();
|
||||||
delNull(t);
|
delNull(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog0 << "Removing gh\n";
|
tlog0 << "Removing gh\n";
|
||||||
delNull(gh);
|
delNull(gh);
|
||||||
tlog0 << "Removed gh!\n";
|
tlog0 << "Removed gh!\n";
|
||||||
|
@ -14,14 +14,30 @@ function incusage(){
|
|||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ "$1" = "--install" ]; then
|
if [ "$1" == "reconf" ]; then
|
||||||
|
cd vcmi
|
||||||
|
autoreconf -i
|
||||||
|
cd ..
|
||||||
|
vcmi/configure --datadir=`pwd` --bindir=`pwd`vcmi --libdir=`pwd`
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" == "--install" ]; then
|
||||||
if [ $# -lt 2 ]; then
|
if [ $# -lt 2 ]; then
|
||||||
incusage
|
incusage
|
||||||
fi
|
fi
|
||||||
|
if [ "$2" == "micro" ]; then
|
||||||
|
unzip vcmipack.zip -d YourAI
|
||||||
|
MAINVCMI_ROOT="/home/mateusz/vcmi_retl"
|
||||||
|
ln -s "$MAINVCMI_ROOT/odpalarka"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
#only lean and full modes
|
||||||
svn co https://vcmi.svn.sourceforge.net/svnroot/vcmi/branches/programmingChallenge/ vcmi
|
svn co https://vcmi.svn.sourceforge.net/svnroot/vcmi/branches/programmingChallenge/ vcmi
|
||||||
errorcheck "fetching sources"
|
errorcheck "fetching sources"
|
||||||
cd vcmi
|
cd vcmi
|
||||||
if [ "$2" = "lean" ]; then
|
|
||||||
|
elif [ "$2" = "lean" ]; then
|
||||||
mv "Makefile without client.am" Makefile.am
|
mv "Makefile without client.am" Makefile.am
|
||||||
mv "configure without client.ac" configure.ac
|
mv "configure without client.ac" configure.ac
|
||||||
rm client/Makefile.am
|
rm client/Makefile.am
|
||||||
@ -64,6 +80,7 @@ elif [ "$1" = "--help" ]; then
|
|||||||
echo "--help displays this info."
|
echo "--help displays this info."
|
||||||
echo "--install full downloads and compiles full VCMI with graphical client; requires ffmpeg."
|
echo "--install full downloads and compiles full VCMI with graphical client; requires ffmpeg."
|
||||||
echo "--install lean downloads and compiles most of VCMI (without graphical client)."
|
echo "--install lean downloads and compiles most of VCMI (without graphical client)."
|
||||||
|
echo "--install micro unpacks vcmipack.zip and makes appropriate symbolic links."
|
||||||
else
|
else
|
||||||
incusage
|
incusage
|
||||||
fi
|
fi
|
||||||
|
Loading…
Reference in New Issue
Block a user