mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 09:31:30 +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());
|
||||
|
||||
#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];
|
||||
|
||||
//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());
|
||||
|
||||
#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;";
|
||||
// eval_str += (std::string)"$" + (std::string)pkgprefix + (std::string)"::questitem = undef;";
|
||||
// eval_str += (std::string)"$" + (std::string)pkgprefix + (std::string)"::entity_list = undef;";
|
||||
// perl->eval(eval_str.c_str());
|
||||
{
|
||||
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";
|
||||
clear_vars_[cl] = 1;
|
||||
clear_vars_[np] = 1;
|
||||
clear_vars_[qi] = 1;
|
||||
clear_vars_[enl] = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
} catch(const char * err) {
|
||||
@ -694,6 +730,30 @@ int PerlembParser::SendCommands(const char *pkgprefix, const char *event, uint32
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -114,6 +114,7 @@ private:
|
||||
|
||||
std::map<std::string, std::string> vars_;
|
||||
SV *_empty_sv;
|
||||
std::map<std::string, int> clear_vars_;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -41,6 +41,7 @@ public:
|
||||
|
||||
void StartQuest(Mob *_owner, Client *_initiator = nullptr, ItemInst* _questitem = nullptr);
|
||||
void EndQuest();
|
||||
bool QuestsRunning() { return !quests_running_.empty(); }
|
||||
|
||||
void Process();
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user