aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_port_task.c
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2012-11-12 14:11:47 +0100
committerRickard Green <[email protected]>2012-11-12 14:11:47 +0100
commit8510507b00b51da4be335faea40116684a380f9a (patch)
tree233194b976773b6ffceeada15cb8e95a631ceee8 /erts/emulator/beam/erl_port_task.c
parenta665a0fbebee3a62ba465cc94d93f06413381ae8 (diff)
parent135fdb3b1804089c5170c5995a9dae653a28f927 (diff)
downloadotp-8510507b00b51da4be335faea40116684a380f9a.tar.gz
otp-8510507b00b51da4be335faea40116684a380f9a.tar.bz2
otp-8510507b00b51da4be335faea40116684a380f9a.zip
Merge branch 'maint'
* maint: ssl: Adopt test case to not take so long Fix bug in erts_port_task_schedule() Use reduction limit in order to determine when to do wakeup Conflicts: erts/emulator/beam/erl_port_task.c erts/emulator/beam/erl_process.c
Diffstat (limited to 'erts/emulator/beam/erl_port_task.c')
-rw-r--r--erts/emulator/beam/erl_port_task.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c
index 86454fe1fa..2c26e1fd45 100644
--- a/erts/emulator/beam/erl_port_task.c
+++ b/erts/emulator/beam/erl_port_task.c
@@ -524,13 +524,8 @@ erts_port_task_schedule(Eterm id,
ERTS_PT_CHK_PRES_PORTQ(runq, pp);
- if (!pp->sched.taskq) {
- pp->sched.taskq = port_taskq_init(port_taskq_alloc(), pp);
- enq_port = !pp->sched.in_runq && !pp->sched.exe_taskq;
- }
-
+ if (!pp->sched.taskq && !pp->sched.in_runq && !pp->sched.exe_taskq) {
#ifdef ERTS_SMP
- if (enq_port) {
ErtsRunQueue *xrunq = erts_check_emigration_need(runq, ERTS_PORT_PRIO_LEVEL);
if (xrunq) {
/* Port emigrated ... */
@@ -540,10 +535,17 @@ erts_port_task_schedule(Eterm id,
if (!runq)
return -1;
}
- }
+ enq_port = !pp->sched.taskq && !pp->sched.in_runq && !pp->sched.exe_taskq;
+#else
+ enq_port = 1;
#endif
+ }
+
+ ASSERT(!enq_port || !(runq->flags & ERTS_RUNQ_FLG_SUSPENDED));
+
+ if (!pp->sched.taskq)
+ pp->sched.taskq = port_taskq_init(port_taskq_alloc(), pp);
- ASSERT(pp->sched.taskq);
ASSERT(ptp);
ptp->type = type;
@@ -932,8 +934,9 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
#endif
done:
- ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(runq));
+ runq->scheduler->reductions += reds;
+ ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(runq));
ERTS_PORT_REDUCTIONS_EXECUTED(runq, reds);
return res;