mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 17:51:28 +00:00
Memory leak work around for perl, should play better with events that call other events now.
This commit is contained in:
parent
bad963ddbc
commit
2e4b4b94ed
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user