diff --git a/scripts/base/frameworks/input/__load__.bro b/scripts/base/frameworks/input/__load__.bro index b41fe5e95f..0e7d8ffb73 100644 --- a/scripts/base/frameworks/input/__load__.bro +++ b/scripts/base/frameworks/input/__load__.bro @@ -1,4 +1,5 @@ @load ./main @load ./readers/ascii @load ./readers/raw +@load ./readers/benchmark diff --git a/scripts/base/frameworks/input/readers/benchmark.bro b/scripts/base/frameworks/input/readers/benchmark.bro new file mode 100644 index 0000000000..3293201cea --- /dev/null +++ b/scripts/base/frameworks/input/readers/benchmark.bro @@ -0,0 +1,8 @@ +##! Interface for the ascii input reader. + +module InputBenchmark; + +export { + ## multiplication factor for each second + const factor = 1 &redef; +} diff --git a/src/input.bif b/src/input.bif index 1157b7b62b..e4ecf4d020 100644 --- a/src/input.bif +++ b/src/input.bif @@ -45,3 +45,6 @@ const unset_field: string; module InputRaw; const record_separator: string; + +module InputBenchmark; +const factor: count; diff --git a/src/input/ReaderBackend.cc b/src/input/ReaderBackend.cc index ce79ecfd39..f0b4f8e7e9 100644 --- a/src/input/ReaderBackend.cc +++ b/src/input/ReaderBackend.cc @@ -58,7 +58,12 @@ public: name(name), num_vals(num_vals), val(val) {} virtual bool Process() { - return input_mgr->SendEvent(name, num_vals, val); + bool success = input_mgr->SendEvent(name, num_vals, val); + + if ( !success ) + reporter->Error("SendEvent for event %s failed", name.c_str()); + + return true; // we do not want to die if sendEvent fails because the event did not return. } private: diff --git a/src/input/readers/Benchmark.cc b/src/input/readers/Benchmark.cc index 07ee7eb9bc..de77ba1afa 100644 --- a/src/input/readers/Benchmark.cc +++ b/src/input/readers/Benchmark.cc @@ -21,6 +21,7 @@ using threading::Field; Benchmark::Benchmark(ReaderFrontend *frontend) : ReaderBackend(frontend) { + multiplication_factor = int(BifConst::InputBenchmark::factor); } Benchmark::~Benchmark() @@ -198,13 +199,25 @@ threading::Value* Benchmark::EntryToVal(TypeTag type, TypeTag subtype) { bool Benchmark::DoHeartbeat(double network_time, double current_time) { ReaderBackend::DoHeartbeat(network_time, current_time); - + num_lines = num_lines*multiplication_factor; + switch ( mode ) { case MANUAL: // yay, we do nothing :) break; case REREAD: case STREAM: + if ( multiplication_factor != 1 ) { + // we have to document at what time we changed the factor to what value. + Value** v = new Value*[2]; + v[0] = new Value(TYPE_COUNT, true); + v[0]->val.uint_val = num_lines; + v[1] = new Value(TYPE_TIME, true); + v[1]->val.double_val = CurrTime(); + + SendEvent("lines_changed", 2, v); + } + Update(); // call update and not DoUpdate, because update actually checks disabled. break; default: diff --git a/src/input/readers/Benchmark.h b/src/input/readers/Benchmark.h index e8de4ac773..e0d3f124af 100644 --- a/src/input/readers/Benchmark.h +++ b/src/input/readers/Benchmark.h @@ -38,6 +38,8 @@ private: int mode; int num_lines; + int multiplication_factor; + string RandomString(const int len); };