add command dependency in shell execution
This commit is contained in:
parent
d1725de606
commit
b641ae15d3
|
@ -108,7 +108,7 @@ class Shell {
|
||||||
void set_command_execute_function(const ShellCommandId& cmd_id,
|
void set_command_execute_function(const ShellCommandId& cmd_id,
|
||||||
std::function<int(int, char**)> exec_func);
|
std::function<int(int, char**)> exec_func);
|
||||||
void set_command_dependency(const ShellCommandId& cmd_id,
|
void set_command_dependency(const ShellCommandId& cmd_id,
|
||||||
const std::vector<ShellCommandId> cmd_dependency);
|
const std::vector<ShellCommandId>& cmd_dependency);
|
||||||
ShellCommandClassId add_command_class(const char* name);
|
ShellCommandClassId add_command_class(const char* name);
|
||||||
public: /* Public validators */
|
public: /* Public validators */
|
||||||
bool valid_command_id(const ShellCommandId& cmd_id) const;
|
bool valid_command_id(const ShellCommandId& cmd_id) const;
|
||||||
|
@ -174,6 +174,9 @@ class Shell {
|
||||||
*/
|
*/
|
||||||
vtr::vector<ShellCommandId, e_exec_func_type> command_execute_function_types_;
|
vtr::vector<ShellCommandId, e_exec_func_type> command_execute_function_types_;
|
||||||
|
|
||||||
|
/* A flag to indicate if the command has been executed */
|
||||||
|
vtr::vector<ShellCommandId, bool> command_status_;
|
||||||
|
|
||||||
/* Dependency graph for different commands,
|
/* Dependency graph for different commands,
|
||||||
* This helps the shell interface to check if a command need other commands to be run before its execution
|
* This helps the shell interface to check if a command need other commands to be run before its execution
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -131,6 +131,7 @@ ShellCommandId Shell<T>::add_command(const Command& cmd, const char* descr) {
|
||||||
command_short_execute_functions_.emplace_back();
|
command_short_execute_functions_.emplace_back();
|
||||||
command_builtin_execute_functions_.emplace_back();
|
command_builtin_execute_functions_.emplace_back();
|
||||||
command_macro_execute_functions_.emplace_back();
|
command_macro_execute_functions_.emplace_back();
|
||||||
|
command_status_.push_back(false); /* By default, the command should be marked as never executed */
|
||||||
command_dependencies_.emplace_back();
|
command_dependencies_.emplace_back();
|
||||||
|
|
||||||
/* Register the name in the name2id map */
|
/* Register the name in the name2id map */
|
||||||
|
@ -202,7 +203,7 @@ void Shell<T>::set_command_execute_function(const ShellCommandId& cmd_id,
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void Shell<T>::set_command_dependency(const ShellCommandId& cmd_id,
|
void Shell<T>::set_command_dependency(const ShellCommandId& cmd_id,
|
||||||
const std::vector<ShellCommandId> dependent_cmds) {
|
const std::vector<ShellCommandId>& dependent_cmds) {
|
||||||
/* Validate the command id as well as each of the command dependency */
|
/* Validate the command id as well as each of the command dependency */
|
||||||
VTR_ASSERT(true == valid_command_id(cmd_id));
|
VTR_ASSERT(true == valid_command_id(cmd_id));
|
||||||
for (ShellCommandId dependent_cmd : dependent_cmds) {
|
for (ShellCommandId dependent_cmd : dependent_cmds) {
|
||||||
|
@ -362,7 +363,14 @@ void Shell<T>::execute_command(const char* cmd_line,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Check the dependency graph to see if all the prequistics have been met */
|
/* Check the dependency graph to see if all the prequistics have been met */
|
||||||
|
for (const ShellCommandId& dep_cmd : command_dependencies_[cmd_id]) {
|
||||||
|
if (false == command_status_[dep_cmd]) {
|
||||||
|
VTR_LOG("Command '%s' is required to be executed before command '%s'!\n",
|
||||||
|
commands_[dep_cmd].name().c_str(), commands_[cmd_id].name().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Find the command! Parse the options
|
/* Find the command! Parse the options
|
||||||
* Note:
|
* Note:
|
||||||
|
@ -391,10 +399,10 @@ void Shell<T>::execute_command(const char* cmd_line,
|
||||||
print_command_options(commands_[cmd_id]);
|
print_command_options(commands_[cmd_id]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse succeed. Let user to confirm selected options */
|
/* Parse succeed. Let user to confirm selected options */
|
||||||
print_command_context(commands_[cmd_id], command_contexts_[cmd_id]);
|
print_command_context(commands_[cmd_id], command_contexts_[cmd_id]);
|
||||||
|
|
||||||
/* Execute the command depending on the type of function ! */
|
/* Execute the command depending on the type of function ! */
|
||||||
switch (command_execute_function_types_[cmd_id]) {
|
switch (command_execute_function_types_[cmd_id]) {
|
||||||
case CONST_STANDARD:
|
case CONST_STANDARD:
|
||||||
|
@ -420,6 +428,9 @@ void Shell<T>::execute_command(const char* cmd_line,
|
||||||
/* Exit the shell using the exit() function inside this class! */
|
/* Exit the shell using the exit() function inside this class! */
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Change the status of the command */
|
||||||
|
command_status_[cmd_id] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
|
|
@ -102,11 +102,13 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
/* Create a command of 'print'
|
/* Create a command of 'print'
|
||||||
* This function will print the value of an internal variable of ShellContext
|
* This function will print the value of an internal variable of ShellContext
|
||||||
|
* We set a dependency to this command as it MUST be executed after 'set'
|
||||||
*/
|
*/
|
||||||
Command shell_cmd_print("print");
|
Command shell_cmd_print("print");
|
||||||
ShellCommandId shell_cmd_print_id = shell.add_command(shell_cmd_print, "Print the value of internal variable 'a'");
|
ShellCommandId shell_cmd_print_id = shell.add_command(shell_cmd_print, "Print the value of internal variable 'a'");
|
||||||
shell.set_command_class(shell_cmd_print_id, arith_cmd_class);
|
shell.set_command_class(shell_cmd_print_id, arith_cmd_class);
|
||||||
shell.set_command_execute_function(shell_cmd_print_id, shell_execute_print);
|
shell.set_command_execute_function(shell_cmd_print_id, shell_execute_print);
|
||||||
|
shell.set_command_dependency(shell_cmd_print_id, std::vector<ShellCommandId>(1, shell_cmd_set_id));
|
||||||
|
|
||||||
/* Create a macro command of 'print_macro'
|
/* Create a macro command of 'print_macro'
|
||||||
* This function will print the value of an internal variable of ShellContext
|
* This function will print the value of an internal variable of ShellContext
|
||||||
|
|
Loading…
Reference in New Issue