Skip to content

Commit

Permalink
Merge branch 'rickard/port-emigrate-bug/maint/OTP-12084' into maint
Browse files Browse the repository at this point in the history
* rickard/port-emigrate-bug/maint/OTP-12084:
  Verify run-queue asserts
  Fix emigrate bug in erts_port_task_schedule()
  • Loading branch information
rickard-green committed Aug 29, 2014
2 parents df16aab + 88bf8f4 commit 25f37cf
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions erts/emulator/beam/erl_port_task.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ static void chk_task_queues(Port *pp, ErtsPortTask *execq, int processing_busy_q
#define DTRACE_DRIVER(PROBE_NAME, PP) do {} while(0)
#endif

#define ERTS_SMP_LC_VERIFY_RQ(RQ, PP) \
do { \
ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(runq)); \
ERTS_SMP_LC_ASSERT((RQ) == ((ErtsRunQueue *) \
erts_smp_atomic_read_nob(&(PP)->run_queue))); \
} while (0)

erts_smp_atomic_t erts_port_task_outstanding_io_tasks;

#define ERTS_PT_STATE_SCHEDULED 0
Expand Down Expand Up @@ -1490,8 +1497,10 @@ erts_port_task_schedule(Eterm id,

#ifdef ERTS_SMP
xrunq = erts_check_emigration_need(runq, ERTS_PORT_PRIO_LEVEL);
ERTS_SMP_LC_ASSERT(runq != xrunq);
ERTS_SMP_LC_VERIFY_RQ(runq, pp);
if (xrunq) {
/* Port emigrated ... */
/* Emigrate port ... */
erts_smp_atomic_set_nob(&pp->run_queue, (erts_aint_t) xrunq);
erts_smp_runq_unlock(runq);
runq = erts_port_runq(pp);
Expand Down Expand Up @@ -1610,6 +1619,8 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
goto done;
}

ERTS_SMP_LC_VERIFY_RQ(runq, pp);

erts_smp_runq_unlock(runq);

*curr_port_pp = pp;
Expand Down Expand Up @@ -1805,14 +1816,16 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)

#ifdef ERTS_SMP
xrunq = erts_check_emigration_need(runq, ERTS_PORT_PRIO_LEVEL);
ERTS_SMP_LC_ASSERT(runq != xrunq);
ERTS_SMP_LC_VERIFY_RQ(runq, pp);
if (!xrunq) {
#endif
enqueue_port(runq, pp);
/* No need to notify ourselves about inc in runq. */
#ifdef ERTS_SMP
}
else {
/* Port emigrated ... */
/* Emigrate port... */
erts_smp_atomic_set_nob(&pp->run_queue, (erts_aint_t) xrunq);
erts_smp_runq_unlock(runq);

Expand Down

0 comments on commit 25f37cf

Please sign in to comment.