Showing the changes to src/vm/scheduler.cpp (1 of 16 files). Show all
Unified · Split
| @@ -25,7 +25,7 @@ vm_scheduler_control_t::~vm_scheduler_control_t() · 24 unmodified lines | |||
| 25 | 25 | ||
| 26 | void default_scheduler_t::worker_main(default_scheduler_t &instance) | 26 | void default_scheduler_t::worker_main(default_scheduler_t &instance) |
| 27 | { | 27 | { |
| 28 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: start\n"); | 28 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: start"); |
| 29 | 29 | ||
| 30 | auto current_thread = std::shared_ptr<thread_instance_t>{}; | 30 | auto current_thread = std::shared_ptr<thread_instance_t>{}; |
| 31 | 31 | ||
| @@ -36,12 +36,12 @@ void default_scheduler_t::worker_main(default_scheduler_t &instance) · 4 unmodified lines | |||
| 36 | current_thread = instance.next_thread(std::move(current_thread)); | 36 | current_thread = instance.next_thread(std::move(current_thread)); |
| 37 | if (current_thread == nullptr) | 37 | if (current_thread == nullptr) |
| 38 | { | 38 | { |
| 39 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: stop\n"); | 39 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: stop"); |
| 40 | break; | 40 | break; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 43 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 44 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: execute: %d\n", current_thread->vm_thread->get_thread_id()); | 44 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: execute: %d", current_thread->vm_thread->get_thread_id()); |
| 45 | 45 | ||
| 46 | current_thread->vm_thread->execute(instance._vm, instance._vm_thread_quanta); | 46 | current_thread->vm_thread->execute(instance._vm, instance._vm_thread_quanta); |
| 47 | } | 47 | } |
| @@ -113,7 +113,7 @@ default_scheduler_t::~default_scheduler_t() · 65 unmodified lines | |||
| 113 | for (auto &w : _worker_pool) | 113 | for (auto &w : _worker_pool) |
| 114 | w.join(); | 114 | w.join(); |
| 115 | 115 | ||
| 116 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: shutdown\n"); | 116 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: shutdown"); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | bool default_scheduler_t::is_idle() const | 119 | bool default_scheduler_t::is_idle() const |
| @@ -134,7 +134,7 @@ const vm_thread_t& default_scheduler_t::schedule_thread(std::unique_ptr<runtime: · 14 unmodified lines | |||
| 134 | throw vm_system_exception{ "Scheduled thread in invalid state" }; | 134 | throw vm_system_exception{ "Scheduled thread in invalid state" }; |
| 135 | 135 | ||
| 136 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 136 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 137 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: scheduled: %d\n", thread->get_thread_id()); | 137 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: scheduled: %d", thread->get_thread_id()); |
| 138 | 138 | ||
| 139 | std::unique_lock<std::mutex> lock{ _vm_threads_lock }; | 139 | std::unique_lock<std::mutex> lock{ _vm_threads_lock }; |
| 140 | 140 | ||
| @@ -249,7 +249,7 @@ void default_scheduler_t::enqueue_blocked_thread(uint32_t thread_id) · 108 unmodified lines | |||
| 249 | _blocked_vm_thread_ids.erase(blocked_iter); | 249 | _blocked_vm_thread_ids.erase(blocked_iter); |
| 250 | 250 | ||
| 251 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 251 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 252 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: enqueue blocked: %d\n", thread_id); | 252 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: enqueue blocked: %d", thread_id); |
| 253 | 253 | ||
| 254 | const bool runnable_thread = enqueue_thread_unsafe(std::move(thread_container), vm_thread_state_t::ready); | 254 | const bool runnable_thread = enqueue_thread_unsafe(std::move(thread_container), vm_thread_state_t::ready); |
| 255 | if (runnable_thread) | 255 | if (runnable_thread) |
| @@ -344,7 +344,7 @@ std::shared_ptr<default_scheduler_t::thread_instance_t> default_scheduler_t::nex · 88 unmodified lines | |||
| 344 | 344 | ||
| 345 | if (!_all_vm_threads.empty() && _blocked_vm_thread_ids.size() == _all_vm_threads.size()) | 345 | if (!_all_vm_threads.empty() && _blocked_vm_thread_ids.size() == _all_vm_threads.size()) |
| 346 | { | 346 | { |
| 347 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::warning, "scheduler: deadlock detected\n"); | 347 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::warning, "scheduler: deadlock detected"); |
| 348 | assert(false && "VM thread deadlock detected"); | 348 | assert(false && "VM thread deadlock detected"); |
| 349 | } | 349 | } |
| 350 | 350 | ||
| @@ -352,7 +352,7 @@ std::shared_ptr<default_scheduler_t::thread_instance_t> default_scheduler_t::nex · 1 unmodified line | |||
| 352 | return{}; | 352 | return{}; |
| 353 | 353 | ||
| 354 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 354 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 355 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: waiting\n"); | 355 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: worker: waiting"); |
| 356 | 356 | ||
| 357 | _worker_event.wait(lock); | 357 | _worker_event.wait(lock); |
| 358 | 358 | ||
| @@ -402,7 +402,7 @@ bool default_scheduler_t::enqueue_thread_unsafe(std::shared_ptr<thread_instance_ · 43 unmodified lines | |||
| 402 | _runnable_vm_thread_ids.push_back(thread_id); | 402 | _runnable_vm_thread_ids.push_back(thread_id); |
| 403 | 403 | ||
| 404 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 404 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 405 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: enqueue: %d\n", thread_id); | 405 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: enqueue: %d", thread_id); |
| 406 | 406 | ||
| 407 | return true; | 407 | return true; |
| 408 | } | 408 | } |
| @@ -414,7 +414,7 @@ bool default_scheduler_t::enqueue_thread_unsafe(std::shared_ptr<thread_instance_ · 5 unmodified lines | |||
| 414 | _blocked_vm_thread_ids.insert(thread_id); | 414 | _blocked_vm_thread_ids.insert(thread_id); |
| 415 | 415 | ||
| 416 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 416 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 417 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: blocked: %d\n", thread_id); | 417 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: blocked: %d", thread_id); |
| 418 | 418 | ||
| 419 | break; | 419 | break; |
| 420 | } | 420 | } |
| @@ -423,7 +423,7 @@ bool default_scheduler_t::enqueue_thread_unsafe(std::shared_ptr<thread_instance_ · 2 unmodified lines | |||
| 423 | case vm_thread_state_t::exiting: | 423 | case vm_thread_state_t::exiting: |
| 424 | { | 424 | { |
| 425 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 425 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 426 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: exiting: %d\n", thread_id); | 426 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: exiting: %d", thread_id); |
| 427 | 427 | ||
| 428 | // Remove the thread | 428 | // Remove the thread |
| 429 | auto thread_to_remove = _all_vm_threads.find(thread_id); | 429 | auto thread_to_remove = _all_vm_threads.find(thread_id); |
| @@ -436,7 +436,7 @@ bool default_scheduler_t::enqueue_thread_unsafe(std::shared_ptr<thread_instance_ · 6 unmodified lines | |||
| 436 | case vm_thread_state_t::broken: | 436 | case vm_thread_state_t::broken: |
| 437 | { | 437 | { |
| 438 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) | 438 | if (debug::is_component_tracing_enabled<debug::component_trace_t::scheduler>()) |
| 439 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: broken: %d\n", thread_id); | 439 | debug::log_msg(debug::component_trace_t::scheduler, debug::log_level_t::debug, "scheduler: broken: %d", thread_id); |
| 440 | 440 | ||
| 441 | auto err_msg = thread_instance->vm_thread->get_error_message(); | 441 | auto err_msg = thread_instance->vm_thread->get_error_message(); |
| 442 | assert(err_msg != nullptr); | 442 | assert(err_msg != nullptr); |