aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-11-07 20:54:17 +0100
committerSverker Eriksson <[email protected]>2017-11-07 20:54:17 +0100
commitc0ad082a9ab3dcaec5a9384f9bc07f78ea45c2c4 (patch)
tree3bb7fc7394e35074d915a679bd1f165b33ecc977 /erts
parentef0d576a15fcf74fba6691b36b06c272a2d02ad3 (diff)
parentd563fdd7f3bfa5df218e3965ca45a0348514a2a7 (diff)
downloadotp-c0ad082a9ab3dcaec5a9384f9bc07f78ea45c2c4.tar.gz
otp-c0ad082a9ab3dcaec5a9384f9bc07f78ea45c2c4.tar.bz2
otp-c0ad082a9ab3dcaec5a9384f9bc07f78ea45c2c4.zip
Merge branch 'sverker/systask-reqid-bug/OTP-14752' into maint
* sverker/systask-reqid-bug: erts: Fix bug in systask scheduling
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/erl_process.c2
-rw-r--r--erts/emulator/test/process_SUITE.erl13
2 files changed, 11 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 1ce2b5071c..1f8a756305 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -11591,7 +11591,7 @@ request_system_task(Process *c_p, Eterm requester, Eterm target,
goto badarg;
req_type = tp[1];
req_id = tp[2];
- req_id_sz = is_immed(req_id) ? req_id : size_object(req_id);
+ req_id_sz = is_immed(req_id) ? 0 : size_object(req_id);
tot_sz = req_id_sz;
for (i = 0; i < ERTS_MAX_PROC_SYS_TASK_ARGS; i++) {
int tix = 3 + i;
diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl
index a9f20f9928..a8bcfac84d 100644
--- a/erts/emulator/test/process_SUITE.erl
+++ b/erts/emulator/test/process_SUITE.erl
@@ -2532,8 +2532,13 @@ system_task_on_suspended(Config) when is_list(Config) ->
end.
gc_request_when_gc_disabled(Config) when is_list(Config) ->
- Master = self(),
AIS = erts_debug:set_internal_state(available_internal_state, true),
+ gc_request_when_gc_disabled_do(ref),
+ gc_request_when_gc_disabled_do(immed),
+ erts_debug:set_internal_state(available_internal_state, AIS).
+
+gc_request_when_gc_disabled_do(ReqIdType) ->
+ Master = self(),
{P, M} = spawn_opt(fun () ->
true = erts_debug:set_internal_state(gc_state,
false),
@@ -2545,7 +2550,10 @@ gc_request_when_gc_disabled(Config) when is_list(Config) ->
receive after 100 -> ok end
end, [monitor, link]),
receive {P, gc_state, false} -> ok end,
- ReqId = make_ref(),
+ ReqId = case ReqIdType of
+ ref -> make_ref();
+ immed -> immed
+ end,
async = garbage_collect(P, [{async, ReqId}]),
receive
{garbage_collect, ReqId, Result} ->
@@ -2554,7 +2562,6 @@ gc_request_when_gc_disabled(Config) when is_list(Config) ->
ok
end,
receive {garbage_collect, ReqId, true} -> ok end,
- erts_debug:set_internal_state(available_internal_state, AIS),
receive {'DOWN', M, process, P, _Reason} -> ok end,
ok.