diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.cpp b/ameasure2/src/provisioner/MeasurementProvisioner.cpp index c085b1895c7abe395a61c679394183c974e3c104..dae789db7664138336dd853a6e077f5c2f85c3f1 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.cpp @@ -101,7 +101,7 @@ MPRPipelineResults MeasurementProvisioner::runPipeline ( const MPPipeline & pipe lseek ( 1, SEEK_SET, 0 ); } - string command = mppcIter->substitute ( substitutionMap ) + " -m"; + string command = mppcIter->substitute ( substitutionMap ); ofdlog << command << endl; @@ -120,22 +120,24 @@ MPRPipelineResults MeasurementProvisioner::runPipeline ( const MPPipeline & pipe break; } - // since we are at the end of file after the output, we need to rewind - lseek ( measurementsFd, SEEK_SET, 0 ); - ifdstream ifd ( measurementsFd ); + if ( mppcIter->getMeasure ( ) ) { + // since we are at the end of file after the output, we need to rewind + lseek ( measurementsFd, SEEK_SET, 0 ); + ifdstream ifd ( measurementsFd ); - deque < sax::Token > tokens; - sax::SaxParseInterface::parseStream ( ifd, tokens ); + deque < sax::Token > tokens; + sax::SaxParseInterface::parseStream ( ifd, tokens ); - measurements::MeasurementResults measurementResults = measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens ); + measurements::MeasurementResults measurementResults = measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens ); - ofdlog << measurements::MeasurementFormat::TREE << measurementResults << endl; + ofdlog << measurements::MeasurementFormat::TREE << measurementResults << endl; - pipelineResults.commandResults.push_back ( { mppcIter->getRawCommand ( ), std::move ( measurementResults ) } ); + pipelineResults.commandResults.push_back ( { mppcIter->getRawCommand ( ), std::move ( measurementResults ) } ); - // destroy the contents and rewind for another commands measurements - ftruncate ( measurementsFd, 0 ); - lseek ( measurementsFd, SEEK_SET, 0 ); + // destroy the contents and rewind for another commands measurements + ftruncate ( measurementsFd, 0 ); + lseek ( measurementsFd, SEEK_SET, 0 ); + } } // close tmp files, which results in their deletion diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp index fb524b75eb166c565ca217aef81f2a5e273bb65a..5d1dafece0c6f915a9b323dd1b1b7bd3abe2f941 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp @@ -27,7 +27,12 @@ struct MPCInputBatch { bool forcedDependencyBatch; }; -using MPCPipeline = std::vector < std::string >; +struct MPCPipelineCommand { + std::string command; + bool measure; +}; + +using MPCPipeline = std::vector < MPCPipelineCommand >; struct MeasurementProvisionerConfiguration { std::string binariesDirectory; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.cpp b/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.cpp index 09eda48dbcfecb3b34c70b07c2f6b0eb33bb337e..2a55961df1d88c74a3b1852c413e59021a1bfa45 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.cpp @@ -182,7 +182,7 @@ void MeasurementProvisionerConfigurationXml::parsePipelines ( MeasurementProvisi FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPELINES_TAG ); } -void MeasurementProvisionerConfigurationXml::parsePipeline ( std::vector < std::string > & pipeline, std::deque < sax::Token >::iterator & iter ) { +void MeasurementProvisionerConfigurationXml::parsePipeline ( MPCPipeline & pipeline, std::deque < sax::Token >::iterator & iter ) { FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPELINE_TAG ); for ( ; ; ) { @@ -190,18 +190,43 @@ void MeasurementProvisionerConfigurationXml::parsePipeline ( std::vector < std:: string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); - if ( data == COMMAND_TAG ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COMMAND_TAG ); - pipeline.emplace_back ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COMMAND_TAG ); - } else { + if ( data == COMMAND_TAG ) + pipeline.push_back ( parsePipelineCommand ( iter ) ); + else break; - } } FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPELINE_TAG ); } +MPCPipelineCommand MeasurementProvisionerConfigurationXml::parsePipelineCommand ( std::deque < sax::Token >::iterator & iter ) { + + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COMMAND_TAG ); + + MPCPipelineCommand mpcpc; + + mpcpc.measure = true; + + if ( FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ATTRIBUTE ) ) { + string attrName = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ATTRIBUTE ); + + if ( attrName == COMMAND_ATTR_MEASURE_NAME ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ATTRIBUTE, attrName ); + string attrVal = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + + if ( attrVal == "false" ) + mpcpc.measure = false; + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ATTRIBUTE, attrName ); + } + } + + mpcpc.command = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COMMAND_TAG ); + + return mpcpc; +} + void MeasurementProvisionerConfigurationXml::parseMeasurementConfiguration ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & iter ) { FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_CONFIGURATION_TAG ); @@ -228,8 +253,9 @@ string MeasurementProvisionerConfigurationXml::INPUT_DATA_ATTR_ID_NAME = "id"; string MeasurementProvisionerConfigurationXml::INPUT_DATA_ATTR_COUNT_NAME = "count"; string MeasurementProvisionerConfigurationXml::PIPELINES_TAG = "Pipelines"; -string MeasurementProvisionerConfigurationXml::PIPELINE_TAG = "Pipeline"; +string MeasurementProvisionerConfigurationXml::PIPELINE_TAG = "Pipeline"; string MeasurementProvisionerConfigurationXml::COMMAND_TAG = "Command"; +string MeasurementProvisionerConfigurationXml::COMMAND_ATTR_MEASURE_NAME = "measure"; string MeasurementProvisionerConfigurationXml::MEASUREMENT_CONFIGURATION_TAG = "MeasurementConfiguration"; } diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.hpp b/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.hpp index 8ca73655b6f880d61e238c31395049301dda0b28..eb594b8ac025e3d9d4ad2c56128669e5776d3219 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfigurationXml.hpp @@ -32,6 +32,8 @@ class MeasurementProvisionerConfigurationXml { static std::string PIPELINE_TAG; static std::string COMMAND_TAG; + static std::string COMMAND_ATTR_MEASURE_NAME; + static std::string MEASUREMENT_CONFIGURATION_TAG; static void parseMeasurementProvisioner ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); @@ -43,7 +45,8 @@ class MeasurementProvisionerConfigurationXml { static MPCInputDatum parseInputDatum ( const std::string &, std::deque < sax::Token >::iterator & ); static void parsePipelines ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); - static void parsePipeline ( std::vector < std::string > &, std::deque < sax::Token >::iterator & ); + static void parsePipeline ( MPCPipeline &, std::deque < sax::Token >::iterator & ); + static MPCPipelineCommand parsePipelineCommand ( std::deque < sax::Token >::iterator & ); static void parseMeasurementConfiguration ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); public: diff --git a/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp b/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp index 1d247d58e5356f9e6eaa49b7ec76b05df42435d3..d935eec9437cd8fcf6d8509ff7c99a1b4c00a428 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerInputData.cpp @@ -103,13 +103,26 @@ bool MPSubstitution::containsSubstitution ( const string & str ) { /*---------------------------------------------------------------------------------------------------------------*/ -MPPipelineCommand::MPPipelineCommand ( std::string str ) : MPSubstitution ( str ), rawCommand ( std::move ( str ) ) { +MPPipelineCommand::MPPipelineCommand ( std::string str, bool measure ) : MPSubstitution ( str ), rawCommand ( std::move ( str ) ), measure ( measure ) { +} + +string MPPipelineCommand::substitute ( const MPSubstitutionMap & substitutionMap ) const { + string res = MPSubstitution::substitute ( substitutionMap ); + + if ( measure ) + res += " -m"; + + return res; } const string & MPPipelineCommand::getRawCommand ( ) const { return rawCommand; } +bool MPPipelineCommand::getMeasure ( ) const { + return measure; +} + /*---------------------------------------------------------------------------------------------------------------*/ MPInputData::MPInputData ( const MeasurementProvisionerConfiguration & mpc ) { @@ -137,8 +150,8 @@ void MPInputData::processMPCInputData ( const MeasurementProvisionerConfiguratio for ( const MPCPipeline & pipeline : mpc.pipelines ) { MPPipeline mpp; - for ( const string & command : pipeline ) { - MPPipelineCommand mppc ( command ); + for ( const MPCPipelineCommand & mpcpc : pipeline ) { + MPPipelineCommand mppc ( mpcpc.command, mpcpc.measure ); if ( this->requiredSubstitutionPattern.size ( ) == 0 ) this->requiredSubstitutionPattern = mppc.getSubstitutionPattern ( ); diff --git a/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp b/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp index 4c81d98649d5c0d6e7954464534c743a0ea53d28..538964034a204b487277b5d8f939fd1b831570f2 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerInputData.hpp @@ -41,7 +41,7 @@ class MPSubstitution { public: MPSubstitution ( const std::string & ); - std::string substitute ( const MPSubstitutionMap & ) const; + virtual std::string substitute ( const MPSubstitutionMap & ) const; const std::set < int > & getSubstitutionPattern ( ) const; private: @@ -56,10 +56,13 @@ public: class MPPipelineCommand : public MPSubstitution { std::string rawCommand; + bool measure; public: - MPPipelineCommand ( std::string ); + MPPipelineCommand ( std::string, bool ); + std::string substitute ( const MPSubstitutionMap & ) const; const std::string & getRawCommand ( ) const; + bool getMeasure ( ) const; }; using MPPipeline = std::list < MPPipelineCommand >; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerResultsXml.cpp b/ameasure2/src/provisioner/MeasurementProvisionerResultsXml.cpp index 85c6aee6addb0efe092baebf791ee43dbaf634c9..ac2be88969d24984ab33f2ff07ab18868f4a32e5 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerResultsXml.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerResultsXml.cpp @@ -118,7 +118,7 @@ string MeasurementProvisionerResultsXml::PIPELINE_TAG = "Pipeline"; string MeasurementProvisionerResultsXml::PIPELINE_STATUS_TAG = "PipelineStatus"; string MeasurementProvisionerResultsXml::EXIT_CODE_TAG = "ExitCode"; string MeasurementProvisionerResultsXml::ERROR_ORIGIN_TAG = "ErrorOrigin"; -string MeasurementProvisionerResultsXml::ERROR_VALUE_TAG = "ErrorValue"; +string MeasurementProvisionerResultsXml::ERROR_VALUE_TAG = "ErrorValue"; string MeasurementProvisionerResultsXml::COMMANDS_TAG = "Commands"; string MeasurementProvisionerResultsXml::COMMAND_TAG = "Command"; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerUtils.cpp b/ameasure2/src/provisioner/MeasurementProvisionerUtils.cpp index c8037d55bb804e3ff5e7f91823ced767d16da854..4792ae68ac35488d1e156f1f36e704aab2049089 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerUtils.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerUtils.cpp @@ -38,7 +38,6 @@ std::string MPUtils::generateTmpfileFromCommand ( const std::string & command ) close ( 1 ); dup ( tempfd ); - int status = system ( command.c_str ( ) ); close ( 1 ); diff --git a/examples2/measurements/ameasure.xml b/examples2/measurements/ameasure.xml index 7dd2871420a71d9acb013a5da3f30a6275e20cd3..7e28dce01c21abf5e74d7f7ed6cf4d7888f90c8d 100644 --- a/examples2/measurements/ameasure.xml +++ b/examples2/measurements/ameasure.xml @@ -23,10 +23,10 @@ </InputData> <Pipelines> <Pipeline> - <Command>./astringology2 -a boyerMooreHorspool -s $1 -p $2</Command> + <Command >./astringology2 -a boyerMooreHorspool -s $1 -p $2</Command> </Pipeline> <Pipeline> - <Command>./astringology2 -a deadZoneUsingBadCharacterShift -s $1 -p $2</Command> + <Command >./astringology2 -a deadZoneUsingBadCharacterShift -s $1 -p $2</Command> </Pipeline> </Pipelines> <MeasurementConfiguration>