diff options
author | Rickard Green <[email protected]> | 2016-01-22 17:48:49 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2016-03-10 16:37:59 +0100 |
commit | 207a569d4caf80b10a54eec2220ac672a3377f00 (patch) | |
tree | 869dbb5c1557cc2f02fa149fc0ff523aaa8802b8 /lib/kernel/src/hipe_unified_loader.erl | |
parent | cbc122135a638da7b8bd74c6725b12da786c93f3 (diff) | |
download | otp-207a569d4caf80b10a54eec2220ac672a3377f00.tar.gz otp-207a569d4caf80b10a54eec2220ac672a3377f00.tar.bz2 otp-207a569d4caf80b10a54eec2220ac672a3377f00.zip |
Improved scheduler suspend functionality
- The calling process is now suspended while synchronizing
scheduler suspends via erlang:system_flag(schedulers_online, _)
and erlang:system_flag(multi_scheduling, _), instead of blocking
the scheduler thread in the BIF call waiting for the operation
to synchronize. Besides releasing the scheduler for other work
(or immediate suspend) it also makes it possible to abort the
operation by killing the process.
- erlang:system_flag(schedulers_online, _) now only wait for normal
schedulers to complete before it returns. This since it may take
a very long time before all dirty schedulers suspends.
- erlang:system_flag(multi_scheduling, block_normal|unblock_normal)
which only operate on normal schedulers has been introduced. This
since there are use cases where suspend of dirty schedulers are
not of interest (hipe loader).
- erlang:system_flag(multi_scheduling, block) still blocks all
dirty schedulers as well as all normal schedulers except one since
it is hard to redefine what multi scheduling block means.
- The three operations:
- changing amount of schedulers online
- blocking/unblocking normal multi scheduling
- blocking/unblocking full multi scheduling
can now be done in parallel. This is important since otherwise
a full multi scheduling block would potentially delay the other
operations for a very long time.
Diffstat (limited to 'lib/kernel/src/hipe_unified_loader.erl')
-rw-r--r-- | lib/kernel/src/hipe_unified_loader.erl | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/lib/kernel/src/hipe_unified_loader.erl b/lib/kernel/src/hipe_unified_loader.erl index 73fcb2469c..087cceb5d8 100644 --- a/lib/kernel/src/hipe_unified_loader.erl +++ b/lib/kernel/src/hipe_unified_loader.erl @@ -105,7 +105,7 @@ load_native_code(Mod, Bin, Architecture) when is_atom(Mod), is_binary(Bin) -> case code:get_chunk(Bin, chunk_name(Architecture)) of undefined -> no_native; NativeCode when is_binary(NativeCode) -> - erlang:system_flag(multi_scheduling, block), + erlang:system_flag(multi_scheduling, block_normal), try OldReferencesToPatch = patch_to_emu_step1(Mod), case load_module(Mod, NativeCode, Bin, OldReferencesToPatch, @@ -114,7 +114,7 @@ load_native_code(Mod, Bin, Architecture) when is_atom(Mod), is_binary(Bin) -> Result -> Result end after - erlang:system_flag(multi_scheduling, unblock) + erlang:system_flag(multi_scheduling, unblock_normal) end end. @@ -125,12 +125,12 @@ load_native_code(Mod, Bin, Architecture) when is_atom(Mod), is_binary(Bin) -> post_beam_load([])-> ok; post_beam_load([_|_]=Mods) -> - erlang:system_flag(multi_scheduling, block), + erlang:system_flag(multi_scheduling, block_normal), try _ = [patch_to_emu(Mod) || Mod <- Mods], ok after - erlang:system_flag(multi_scheduling, unblock) + erlang:system_flag(multi_scheduling, unblock_normal) end, ok. @@ -151,11 +151,11 @@ version_check(Version, Mod) when is_atom(Mod) -> 'bad_crc' | {'module', Mod} when Mod :: atom(). load_module(Mod, Bin, Beam, Architecture) -> - erlang:system_flag(multi_scheduling, block), + erlang:system_flag(multi_scheduling, block_normal), try load_module_nosmp(Mod, Bin, Beam, Architecture) after - erlang:system_flag(multi_scheduling, unblock) + erlang:system_flag(multi_scheduling, unblock_normal) end. load_module_nosmp(Mod, Bin, Beam, Architecture) -> @@ -173,11 +173,11 @@ load_module(Mod, Bin, Beam, OldReferencesToPatch, Architecture) -> 'bad_crc' | {'module', Mod} when Mod :: atom(). load(Mod, Bin, Architecture) -> - erlang:system_flag(multi_scheduling, block), + erlang:system_flag(multi_scheduling, block_normal), try load_nosmp(Mod, Bin, Architecture) after - erlang:system_flag(multi_scheduling, unblock) + erlang:system_flag(multi_scheduling, unblock_normal) end. load_nosmp(Mod, Bin, Architecture) -> |