diff options
author | Patrik Nyblom <[email protected]> | 2013-04-25 17:37:54 +0200 |
---|---|---|
committer | Patrik Nyblom <[email protected]> | 2013-04-25 17:37:54 +0200 |
commit | 560226377bc9a732fb3a9c20dde907def56e3d30 (patch) | |
tree | 50b6e709ad80899fd8ca5419eda749f8f5a0d6da /erts/emulator/beam/erl_port_task.c | |
parent | 408a4b2009213e40a6d303fce786aa7bc27c9697 (diff) | |
download | otp-560226377bc9a732fb3a9c20dde907def56e3d30.tar.gz otp-560226377bc9a732fb3a9c20dde907def56e3d30.tar.bz2 otp-560226377bc9a732fb3a9c20dde907def56e3d30.zip |
Add long_schedule detection for ports and testcases
Diffstat (limited to 'erts/emulator/beam/erl_port_task.c')
-rw-r--r-- | erts/emulator/beam/erl_port_task.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c index 3dc7c14faf..d25af94099 100644 --- a/erts/emulator/beam/erl_port_task.c +++ b/erts/emulator/beam/erl_port_task.c @@ -746,6 +746,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) int reds = ERTS_PORT_REDS_EXECUTE; erts_aint_t io_tasks_executed = 0; int fpe_was_unmasked; + Uint64 start_time = 0; ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(runq)); @@ -808,6 +809,10 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) reset_handle(ptp); erts_smp_runq_unlock(runq); + if (erts_system_monitor_long_schedule != 0) { + start_time = erts_timestamp_millis(); + } + ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(pp)); ERTS_SMP_CHK_NO_PROC_LOCKS; ASSERT(pp->drv_ptr); @@ -881,6 +886,13 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) erts_terminate_port(pp); } + if (start_time != 0) { + Sint64 diff = erts_timestamp_millis() - start_time; + if (diff > 0 && (Uint) diff > erts_system_monitor_long_schedule) { + monitor_long_schedule_port(pp,ptp->type,(Uint) diff); + } + } + start_time = 0; ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(pp)); #ifdef ERTS_SMP |