Showing the changes to src/exec/main.cpp (1 of 3 files). Show all
Unified · Split
| @@ -12,6 +12,7 @@ · 11 unmodified lines | ||
| 12 | 12 | #include <debug.h> |
| 13 | 13 | #include <exceptions.h> |
| 14 | 14 | #include <vm_asm.h> |
| 15 | +#include <vm_version.h> | |
| 15 | 16 | #include "exec.h" |
| 16 | 17 | |
| 17 | 18 | using namespace disvm; |
| @@ -169,7 +170,7 @@ namespace · 151 unmodified lines | ||
| 169 | 170 | |
| 170 | 171 | struct arg_exception_t : std::runtime_error |
| 171 | 172 | { |
| 172 | − arg_exception_t(const char *m, const char *arg) | |
| 173 | + arg_exception_t(const char *m, const char *arg = nullptr) | |
| 173 | 174 | : std::runtime_error{ m } |
| 174 | 175 | , arg{ arg } |
| 175 | 176 | { } |
| @@ -179,8 +180,20 @@ struct arg_exception_t : std::runtime_error · 3 unmodified lines | ||
| 179 | 180 | |
| 180 | 181 | struct exec_options |
| 181 | 182 | { |
| 183 | + exec_options() | |
| 184 | + : debugger{} | |
| 185 | + , enabled_debugger{ false } | |
| 186 | + , quiet_start{ false } | |
| 187 | + , print_help{ false } | |
| 188 | + , sys_thread_count{ vm_t::default_system_thread_count } | |
| 189 | + , thread_quanta{ vm_t::default_thread_quanta } | |
| 190 | + { } | |
| 191 | + | |
| 182 | 192 | std::vector<char *> vm_args; |
| 183 | 193 | |
| 194 | + uint32_t sys_thread_count; | |
| 195 | + uint32_t thread_quanta; | |
| 196 | + | |
| 184 | 197 | bool print_help; |
| 185 | 198 | bool quiet_start; |
| 186 | 199 | bool enabled_debugger; |
| @@ -189,10 +202,15 @@ struct exec_options · 2 unmodified lines | ||
| 189 | 202 | |
| 190 | 203 | void print_banner(const exec_options &options) |
| 191 | 204 | { |
| 205 | + std::cout << "DisVM " << DISVM_VERSION_MAJOR << '.' << DISVM_VERSION_MINOR << '.' << DISVM_VERSION_PATCH; | |
| 206 | + | |
| 207 | + if (DISVM_VERSION_LABEL != nullptr) | |
| 208 | + std::cout << '-' << DISVM_VERSION_LABEL; | |
| 209 | + | |
| 192 | 210 | std::cout |
| 193 | − << "DisVM\n" | |
| 194 | − << "----------------\n" | |
| 195 | − << "Debugger enabled: " << std::boolalpha << options.enabled_debugger << "\n"; | |
| 211 | + << "\n----------------\n" | |
| 212 | + << "Debugger enabled: " << std::boolalpha << options.enabled_debugger << "\n" | |
| 213 | + << "System thread usage: " << options.sys_thread_count << "\n"; | |
| 196 | 214 | |
| 197 | 215 | if (options.enabled_debugger) |
| 198 | 216 | std::cout << options.debugger << "\n"; |
| @@ -203,12 +221,13 @@ void print_banner(const exec_options &options) · 4 unmodified lines | ||
| 203 | 221 | void print_help() |
| 204 | 222 | { |
| 205 | 223 | std::cout |
| 206 | − << "Usage: disvm-exec [-d[e|m|x]*] [-q] [-?] <entry module> <args>*\n" | |
| 224 | + << "Usage: disvm-exec [-d[e|m|x]*] [-t <num>] [-q] [-?] <entry module> <args>*\n" | |
| 207 | 225 | << " d - Enable debugger\n" |
| 208 | 226 | << " e - Break on entry\n" |
| 209 | 227 | << " m - Break on module load\n" |
| 210 | 228 | << " x - Break on exception (first chance)\n" |
| 211 | 229 | << " q - Suppress banner and configuration\n" |
| 230 | + << " t - Specify the number of system threads to use (0 < x <= 4)\n" | |
| 212 | 231 | << " ? - Print help\n"; |
| 213 | 232 | } |
| 214 | 233 | |
| @@ -243,7 +262,21 @@ void process_arg(char* arg, std::function<char *()> next, exec_options &options) · 28 unmodified lines | ||
| 243 | 262 | break; |
| 244 | 263 | } |
| 245 | 264 | } |
| 265 | + break; | |
| 266 | + | |
| 267 | + case 't': | |
| 268 | + { | |
| 269 | + auto sys_threads_str = next(); | |
| 270 | + if (sys_threads_str == nullptr) | |
| 271 | + throw arg_exception_t{ "System thread requires count" }; | |
| 246 | 272 | |
| 273 | + char *end; | |
| 274 | + auto sys_threads = ::strtol(sys_threads_str, &end, 10); | |
| 275 | + if (sys_threads <= 0 || 4 < sys_threads) | |
| 276 | + throw arg_exception_t{ "Invalid system thread value", sys_threads_str }; | |
| 277 | + | |
| 278 | + options.sys_thread_count = sys_threads; | |
| 279 | + } | |
| 247 | 280 | break; |
| 248 | 281 | |
| 249 | 282 | case 'q': |
| @@ -293,7 +326,7 @@ int main(int argc, char* argv[]) · 43 unmodified lines | ||
| 293 | 326 | return EXIT_SUCCESS; |
| 294 | 327 | } |
| 295 | 328 | |
| 296 | − vm_t vm; | |
| 329 | + vm_t vm{ options.sys_thread_count, options.thread_quanta }; | |
| 297 | 330 | |
| 298 | 331 | if (options.enabled_debugger) |
| 299 | 332 | vm.load_tool(std::make_shared<debugger>(options.debugger)); |