Huge performance improvement: passing variables as pointers avoiding copies

This commit is contained in:
Felipe Zimmerle
2015-09-18 20:21:12 -03:00
parent 2451bf05d7
commit 076a02951c
45 changed files with 207 additions and 208 deletions

View File

@@ -27,18 +27,16 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Duration::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
std::string res;
std::pair<std::string, std::string> pair;
double e = cpu_seconds() - assay->start;
res = std::to_string(e);
pair = std::make_pair(std::string("DURATION"), std::string(res));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("DURATION", std::string(res)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class Duration : public Variable {
explicit Duration(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,9 +33,9 @@ extern char **environ;
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Env::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
std::map<std::string, std::string> envs;
for (char **current = environ; *current; current++) {
@@ -49,9 +49,7 @@ std::list<std::pair<std::string, std::string>>
envs.insert(std::pair<std::string, std::string>("ENV:" + key, value));
if ("env:" + key == name) {
std::pair<std::string, std::string> pair;
pair = std::make_pair(name, value);
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar(name, value));
return resl;
}
}
@@ -61,9 +59,7 @@ std::list<std::pair<std::string, std::string>>
&& (x.first != name)) {
continue;
}
std::pair<std::string, std::string> pair;
pair = std::make_pair(x.first, x.second);
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar(x.first, x.second));
}
return resl;

View File

@@ -33,7 +33,7 @@ class Env : public Variable {
explicit Env(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -26,14 +26,12 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
HighestSeverity::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
pair = std::make_pair(std::string("HIGHEST_SEVERITY"),
std::to_string(assay->highest_severity));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("HIGHEST_SEVERITY",
std::to_string(assay->highest_severity)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class HighestSeverity : public Variable {
explicit HighestSeverity(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -27,10 +27,9 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
ModsecBuild::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
std::ostringstream ss;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_MAJOR;
@@ -38,8 +37,7 @@ std::list<std::pair<std::string, std::string>>
ss << std::setw(2) << std::setfill('0') << MODSECURITY_PATCHLEVEL;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_TAG_NUM;
pair = std::make_pair(std::string("MODSEC_BUILD"), ss.str());
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("MODSEC_BUILD", ss.str()));
return resl;
}

View File

@@ -33,7 +33,7 @@ class ModsecBuild : public Variable {
explicit ModsecBuild(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Time::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%H:%M:%S", &timeinfo);
pair = std::make_pair(std::string("TIME"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME", std::string(tstr)));
return resl;
}

View File

@@ -34,7 +34,7 @@ class Time : public Variable {
explicit Time(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeDay::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%d", &timeinfo);
pair = std::make_pair(std::string("TIME_DAY"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_DAY", std::string(tstr)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeDay : public Variable {
explicit TimeDay(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,14 +33,11 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeEpoch::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
pair = std::make_pair(std::string("TIME_EPOCH"),
std::to_string(std::time(nullptr)));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_EPOCH", std::to_string(std::time(nullptr))));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeEpoch : public Variable {
explicit TimeEpoch(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeHour::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%H", &timeinfo);
pair = std::make_pair(std::string("TIME_HOUR"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_HOUR", std::string(tstr)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeHour : public Variable {
explicit TimeHour(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeMin::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%M", &timeinfo);
pair = std::make_pair(std::string("TIME_MIN"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_MIN", std::string(tstr)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeMin : public Variable {
explicit TimeMin(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeMon::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -49,9 +49,7 @@ std::list<std::pair<std::string, std::string>>
int a = atoi(tstr);
a--;
pair = std::make_pair(std::string("TIME_MON"),
std::to_string(a));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_MON", std::to_string(a)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeMon : public Variable {
explicit TimeMon(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeSec::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%S", &timeinfo);
pair = std::make_pair(std::string("TIME_SEC"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_SEC", std::string(tstr)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeSec : public Variable {
explicit TimeSec(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeWDay::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -49,9 +49,7 @@ std::list<std::pair<std::string, std::string>>
int a = atoi(tstr);
a--;
pair = std::make_pair(std::string("TIME_WDAY"),
std::to_string(a));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_WDAY", std::to_string(a)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeWDay : public Variable {
explicit TimeWDay(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
TimeYear::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -47,9 +47,7 @@ std::list<std::pair<std::string, std::string>>
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%Y", &timeinfo);
pair = std::make_pair(std::string("TIME_YEAR"),
std::string(tstr));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TIME_YEAR", std::string(tstr)));
return resl;
}

View File

@@ -33,7 +33,7 @@ class TimeYear : public Variable {
explicit TimeYear(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -33,15 +33,11 @@
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Tx::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> resl;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *resl = new std::list<ModSecurityStringVar *>();
pair = std::make_pair(std::string("TX:0"),
std::string("teste"));
resl.push_back(pair);
resl->push_back(new ModSecurityStringVar("TX:0", "teste"));
return resl;
}

View File

@@ -34,7 +34,7 @@ class Tx : public Variable {
explicit Tx(std::string _name)
: Variable(_name) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
};

View File

@@ -28,9 +28,11 @@ using ModSecurity::Variables::Variations::Exclusion;
namespace ModSecurity {
namespace Variables {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Variable::evaluate(Assay *assay) {
return assay->resolve_variable(this->name);
std::list<ModSecurityStringVar *> *l = new std::list<ModSecurityStringVar *>();
assay->resolve_variable(this->name, l);
return l;
}
std::string Variable::to_s(

View File

@@ -17,6 +17,7 @@
#include <string>
#include <list>
#include <utility>
#include "modsecurity/assay.h"
#ifndef SRC_VARIABLES_VARIABLE_H_
#define SRC_VARIABLES_VARIABLE_H_
@@ -32,7 +33,7 @@ class Variable {
: name(_name) { }
static std::string to_s(std::vector<Variable *> *variables);
virtual std::list<std::pair<std::string, std::string>>
virtual std::list<ModSecurityStringVar *> *
evaluate(Assay *assay);
std::string name;
};

View File

@@ -28,23 +28,22 @@ namespace ModSecurity {
namespace Variables {
namespace Variations {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Count::evaluate(Assay *assay) {
std::list<std::pair<std::string, std::string>> reslIn;
std::list<std::pair<std::string, std::string>> reslOut;
std::pair<std::string, std::string> pair;
std::list<ModSecurityStringVar *> *reslIn;
std::list<ModSecurityStringVar *> *reslOut = new std::list<ModSecurityStringVar *>();
int count = 0;
reslIn = var->evaluate(assay);
for (auto &a : reslIn) {
for (auto &a : *reslIn) {
count++;
}
std::string res = std::to_string(count);
pair = std::make_pair(std::string(var->name), std::string(res));
reslOut.push_back(pair);
reslOut->push_back(new ModSecurityStringVar(std::string(var->name),
std::string(res)));
return reslOut;
}

View File

@@ -35,7 +35,7 @@ class Count : public Variable {
: Variable("count(" + v->name + ")"),
var(v) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
Variable *var;

View File

@@ -29,9 +29,11 @@ namespace Variables {
namespace Variations {
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
Exclusion::evaluate(Assay *assay) {
return assay->resolve_variable(this->name);
std::list<ModSecurityStringVar *> *l = new std::list<ModSecurityStringVar *>();
assay->resolve_variable(this->name, l);
return l;
}

View File

@@ -36,7 +36,7 @@ class Exclusion : public Variable {
: Variable(v->name),
var(v) { }
std::list<std::pair<std::string, std::string>>
std::list<ModSecurityStringVar *> *
evaluate(Assay *assay) override;
Variable *var;