Skip to content

Commit 2d871ab

Browse files
committed
Merge branch 'maint'
* maint: [erts] Ensure that prio msgq markers are only installed when needed
2 parents f22dbc5 + dc9adbb commit 2d871ab

3 files changed

Lines changed: 536 additions & 6 deletions

File tree

erts/emulator/beam/bif.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ static BIF_RETTYPE link_opt(Process *c_p, Eterm other, Eterm opts)
395395

396396
ERTS_BIF_PREP_ERROR(ret_val, c_p, BADARG);
397397

398+
return ret_val;
399+
398400
done:
399401

400402
if (prio_change) {
@@ -484,11 +486,14 @@ demonitor(Process *c_p, Eterm ref, Eterm *multip)
484486
case ERTS_ML_STATE_ALIAS_DEMONITOR:
485487
default:
486488
erts_monitor_tree_delete(&ERTS_P_MONITORS(c_p), mon);
487-
if (mon->flags & ERTS_ML_FLG_PRIO_ML)
488-
erts_proc_sig_prio_item_deleted(c_p, ERTS_PRIO_ITEM_TYPE_MONITOR);
489+
if (mon->flags & ERTS_ML_FLG_PRIO_ALIAS)
490+
erts_proc_sig_prio_item_deleted(c_p, ERTS_PRIO_ITEM_TYPE_ALIAS);
489491
break;
490492
}
491493

494+
if (mon->flags & ERTS_ML_FLG_PRIO_ML)
495+
erts_proc_sig_prio_item_deleted(c_p, ERTS_PRIO_ITEM_TYPE_MONITOR);
496+
492497
switch (ERTS_ML_GET_TYPE(mon)) {
493498

494499
case ERTS_MON_TYPE_TIME_OFFSET:
@@ -773,7 +778,11 @@ static BIF_RETTYPE monitor(Process *c_p, Eterm type, Eterm target,
773778

774779
local_process:
775780

776-
if (id != c_p->common.id) {
781+
if (id == c_p->common.id) {
782+
/* No monitoring of self... */
783+
add_oflags = 0;
784+
}
785+
else {
777786
mdp = erts_monitor_create(ERTS_MON_TYPE_PROC,
778787
ref, c_p->common.id,
779788
id, name, tag);
@@ -960,6 +969,7 @@ static BIF_RETTYPE monitor(Process *c_p, Eterm type, Eterm target,
960969

961970
badarg:
962971

972+
add_oflags = 0;
963973
ERTS_BIF_PREP_ERROR(ret_val, c_p, BADARG);
964974

965975
done:

erts/emulator/beam/erl_proc_sig_queue.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6052,8 +6052,18 @@ handle_altact_msg(Process *c_p, ErtsSigRecvTracing *tracing,
60526052
mon->flags &= ~ERTS_ML_STATE_ALIAS_MASK;
60536053

60546054
erts_monitor_tree_delete(&ERTS_P_MONITORS(c_p), mon);
6055-
if (flags & ERTS_ML_FLG_PRIO_ALIAS)
6055+
if (flags & ERTS_ML_FLG_PRIO_ALIAS) {
6056+
mon->flags &= ~ERTS_ML_FLG_PRIO_ALIAS;
6057+
/*
6058+
* See comment at end of function why we don't delete alias
6059+
* reference now...
6060+
*/
60566061
prio_alias_deactivated = !0;
6062+
}
6063+
if (flags & ERTS_ML_FLG_PRIO_ML) {
6064+
mon->flags &= ~ERTS_ML_FLG_PRIO_ML;
6065+
erts_proc_sig_prio_item_deleted(c_p, ERTS_PRIO_ITEM_TYPE_MONITOR);
6066+
}
60576067

60586068
switch (ERTS_ML_GET_TYPE(mon)) {
60596069
case ERTS_MON_TYPE_DIST_PORT:
@@ -6675,6 +6685,11 @@ erts_proc_sig_handle_incoming(Process *c_p, erts_aint32_t *statep,
66756685
ErtsELink *elnk;
66766686
ErtsLink *dlnk = erts_link_to_other(llnk, &elnk);
66776687
if (!elnk->unlinking) {
6688+
if (llnk->flags & ERTS_ML_FLG_PRIO_ML) {
6689+
llnk->flags &= ~ERTS_ML_FLG_PRIO_ML;
6690+
erts_proc_sig_prio_item_deleted(
6691+
c_p, ERTS_PRIO_ITEM_TYPE_LINK);
6692+
}
66786693
erts_link_tree_delete(&ERTS_P_LINKS(c_p), llnk);
66796694
if (erts_link_dist_delete(dlnk))
66806695
erts_link_release_both(&elnk->ld);
@@ -6693,6 +6708,11 @@ erts_proc_sig_handle_incoming(Process *c_p, erts_aint32_t *statep,
66936708
llnk = erts_link_tree_lookup(ERTS_P_LINKS(c_p),
66946709
sulnk->from);
66956710
if (llnk && !((ErtsILink *) llnk)->unlinking) {
6711+
if (llnk->flags & ERTS_ML_FLG_PRIO_ML) {
6712+
llnk->flags &= ~ERTS_ML_FLG_PRIO_ML;
6713+
erts_proc_sig_prio_item_deleted(
6714+
c_p, ERTS_PRIO_ITEM_TYPE_LINK);
6715+
}
66966716
if (tracing.procs)
66976717
getting_unlinked(c_p, sulnk->from);
66986718
erts_link_tree_delete(&ERTS_P_LINKS(c_p), llnk);

0 commit comments

Comments
 (0)