diff options
author | Rickard Green <[email protected]> | 2013-01-23 14:52:03 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2013-01-23 14:52:03 +0100 |
commit | 6141db8f76d310f648cc8e278cf9b62bf1417ca8 (patch) | |
tree | 4e8e34ff9c53b9ac2650dfb993f2af159acd53f0 /erts/emulator/beam/erl_port_task.c | |
parent | cc8285ed57ad46fcbbbfb333535ff472dd57ec27 (diff) | |
parent | e3373f0602282040ae7a75b5b7ebbdcae2789c17 (diff) | |
download | otp-6141db8f76d310f648cc8e278cf9b62bf1417ca8.tar.gz otp-6141db8f76d310f648cc8e278cf9b62bf1417ca8.tar.bz2 otp-6141db8f76d310f648cc8e278cf9b62bf1417ca8.zip |
Merge branch 'rickard/r16/port-optimizations/OTP-10336'
* rickard/r16/port-optimizations/OTP-10336:
Bump reductions also for immediate driver calls
Add 'port_count' and 'port_limit' to system_info/1 spec
Fix documentation
Replace use of deprecated functions in test cases
Replace use of driver_send_term() with erl_drv_send_term()
Conflicts:
erts/preloaded/ebin/erlang.beam
Diffstat (limited to 'erts/emulator/beam/erl_port_task.c')
-rw-r--r-- | erts/emulator/beam/erl_port_task.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c index 8ceadcdb8c..09c8e760f4 100644 --- a/erts/emulator/beam/erl_port_task.c +++ b/erts/emulator/beam/erl_port_task.c @@ -35,6 +35,11 @@ #include "dtrace-wrapper.h" #include <stdarg.h> +/* + * ERTS_PORT_CALLBACK_VREDS: Limit the amount of callback calls we do... + */ +#define ERTS_PORT_CALLBACK_VREDS (CONTEXT_REDS/5) + #if defined(DEBUG) && 0 #define ERTS_HARD_DEBUG_TASK_QUEUES #else @@ -1544,6 +1549,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) ErtsPortTask *execq; int processing_busy_q; int res = 0; + int vreds = 0; int reds = ERTS_PORT_REDS_EXECUTE; erts_aint_t io_tasks_executed = 0; int fpe_was_unmasked; @@ -1688,6 +1694,9 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) break; } + vreds += ERTS_PORT_CALLBACK_VREDS; + reds += ERTS_PORT_CALLBACK_VREDS; + if (reds >= CONTEXT_REDS) break; } @@ -1757,6 +1766,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) res = (erts_smp_atomic_read_nob(&erts_port_task_outstanding_io_tasks) != (erts_aint_t) 0); + reds -= vreds; runq->scheduler->reductions += reds; ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(runq)); |