Memory leak work around for perl, should play better with events that call other events now.

This commit is contained in:
KimLS 2014-03-09 17:55:24 -07:00
parent bad963ddbc
commit 2e4b4b94ed
3 changed files with 67 additions and 5 deletions

View File

@ -632,6 +632,37 @@ int PerlembParser::SendCommands(const char *pkgprefix, const char *event, uint32
perl->eval(cmd.c_str()); perl->eval(cmd.c_str());
#ifdef EMBPERL_XS_CLASSES #ifdef EMBPERL_XS_CLASSES
{
std::string cl = (std::string)"$" + (std::string)pkgprefix + (std::string)"::client";
std::string np = (std::string)"$" + (std::string)pkgprefix + (std::string)"::npc";
std::string qi = (std::string)"$" + (std::string)pkgprefix + (std::string)"::questitem";
std::string enl = (std::string)"$" + (std::string)pkgprefix + (std::string)"::entity_list";
if(clear_vars_.find(cl) != clear_vars_.end()) {
std::string eval_str = cl;
eval_str += " = undef;";
perl->eval(eval_str.c_str());
}
if (clear_vars_.find(np) != clear_vars_.end()) {
std::string eval_str = np;
eval_str += " = undef;";
perl->eval(eval_str.c_str());
}
if (clear_vars_.find(qi) != clear_vars_.end()) {
std::string eval_str = qi;
eval_str += " = undef;";
perl->eval(eval_str.c_str());
}
if (clear_vars_.find(enl) != clear_vars_.end()) {
std::string eval_str = enl;
eval_str += " = undef;";
perl->eval(eval_str.c_str());
}
}
char namebuf[64]; char namebuf[64];
//init a couple special vars: client, npc, entity_list //init a couple special vars: client, npc, entity_list
@ -670,11 +701,16 @@ int PerlembParser::SendCommands(const char *pkgprefix, const char *event, uint32
ret_value = perl->dosub(std::string(pkgprefix).append("::").append(event).c_str()); ret_value = perl->dosub(std::string(pkgprefix).append("::").append(event).c_str());
#ifdef EMBPERL_XS_CLASSES #ifdef EMBPERL_XS_CLASSES
// std::string eval_str = (std::string)"$" + (std::string)pkgprefix + (std::string)"::client = undef;"; {
// eval_str += (std::string)"$" + (std::string)pkgprefix + (std::string)"::npc = undef;"; std::string cl = (std::string)"$" + (std::string)pkgprefix + (std::string)"::client";
// eval_str += (std::string)"$" + (std::string)pkgprefix + (std::string)"::questitem = undef;"; std::string np = (std::string)"$" + (std::string)pkgprefix + (std::string)"::npc";
// eval_str += (std::string)"$" + (std::string)pkgprefix + (std::string)"::entity_list = undef;"; std::string qi = (std::string)"$" + (std::string)pkgprefix + (std::string)"::questitem";
// perl->eval(eval_str.c_str()); std::string enl = (std::string)"$" + (std::string)pkgprefix + (std::string)"::entity_list";
clear_vars_[cl] = 1;
clear_vars_[np] = 1;
clear_vars_[qi] = 1;
clear_vars_[enl] = 1;
}
#endif #endif
} catch(const char * err) { } catch(const char * err) {
@ -694,6 +730,30 @@ int PerlembParser::SendCommands(const char *pkgprefix, const char *event, uint32
} }
quest_manager.EndQuest(); quest_manager.EndQuest();
#ifdef EMBPERL_XS_CLASSES
if(!quest_manager.QuestsRunning()) {
auto iter = clear_vars_.begin();
std::string eval_str;
while(iter != clear_vars_.end()) {
eval_str += iter->first;
eval_str += " = undef;";
++iter;
}
clear_vars_.clear();
try {
perl->eval(eval_str.c_str());
}
catch (const char * err) {
std::string error = "Script clear error: ";
if (strlen(err) > 0)
error += err;
AddError(error);
}
}
#endif
return ret_value; return ret_value;
} }

View File

@ -114,6 +114,7 @@ private:
std::map<std::string, std::string> vars_; std::map<std::string, std::string> vars_;
SV *_empty_sv; SV *_empty_sv;
std::map<std::string, int> clear_vars_;
}; };
#endif #endif

View File

@ -41,6 +41,7 @@ public:
void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr); void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr);
void EndQuest(); void EndQuest();
bool QuestsRunning() { return !quests_running_.empty(); }
void Process(); void Process();