aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2010-02-10 09:11:31 +0000
committerErlang/OTP <[email protected]>2010-02-10 10:14:39 +0100
commit3241e0ad7b6c85372b1c7577a760c8695e648e85 (patch)
tree6740a2cbc79559db8a2c03c9bc94e46d2dcecf97
parenta32352f3e450dcf13ff6a191ae73327f5f93d41b (diff)
parent4a158f3110809b6edb393b3f0b558199f8c133d8 (diff)
downloadotp-3241e0ad7b6c85372b1c7577a760c8695e648e85.tar.gz
otp-3241e0ad7b6c85372b1c7577a760c8695e648e85.tar.bz2
otp-3241e0ad7b6c85372b1c7577a760c8695e648e85.zip
Merge branch 'mp/hipe_unified_loader' into ccase/r13b04_dev
* mp/hipe_unified_loader: hipe_unified_loader: only block SMP scheduling when necessary
-rw-r--r--lib/kernel/src/hipe_unified_loader.erl42
1 files changed, 20 insertions, 22 deletions
diff --git a/lib/kernel/src/hipe_unified_loader.erl b/lib/kernel/src/hipe_unified_loader.erl
index 42eab67478..f289b8110d 100644
--- a/lib/kernel/src/hipe_unified_loader.erl
+++ b/lib/kernel/src/hipe_unified_loader.erl
@@ -96,14 +96,6 @@ load_hipe_modules() ->
%% code:load_file/1) and the atom `no_native' on failure.
load_native_code(Mod, Bin) when is_atom(Mod), is_binary(Bin) ->
- erlang:system_flag(multi_scheduling, block),
- try
- load_native_code_nosmp(Mod, Bin)
- after
- erlang:system_flag(multi_scheduling, unblock)
- end.
-
-load_native_code_nosmp(Mod, Bin) ->
Architecture = erlang:system_info(hipe_architecture),
try chunk_name(Architecture) of
ChunkTag ->
@@ -111,10 +103,15 @@ load_native_code_nosmp(Mod, Bin) ->
case code:get_chunk(Bin, ChunkTag) of
undefined -> no_native;
NativeCode when is_binary(NativeCode) ->
- OldReferencesToPatch = patch_to_emu_step1(Mod),
- case load_module(Mod, NativeCode, Bin, OldReferencesToPatch) of
- bad_crc -> no_native;
- Result -> Result
+ erlang:system_flag(multi_scheduling, block),
+ try
+ OldReferencesToPatch = patch_to_emu_step1(Mod),
+ case load_module(Mod, NativeCode, Bin, OldReferencesToPatch) of
+ bad_crc -> no_native;
+ Result -> Result
+ end
+ after
+ erlang:system_flag(multi_scheduling, unblock)
end
end
catch
@@ -128,17 +125,18 @@ load_native_code_nosmp(Mod, Bin) ->
-spec post_beam_load(atom()) -> 'ok'.
post_beam_load(Mod) when is_atom(Mod) ->
- erlang:system_flag(multi_scheduling, block),
- try
- post_beam_load_nosmp(Mod)
- after
- erlang:system_flag(multi_scheduling, unblock)
- end.
-
-post_beam_load_nosmp(Mod) ->
Architecture = erlang:system_info(hipe_architecture),
- try chunk_name(Architecture) of _ChunkTag -> patch_to_emu(Mod)
- catch _:_ -> ok
+ try chunk_name(Architecture) of
+ _ChunkTag ->
+ erlang:system_flag(multi_scheduling, block),
+ try
+ patch_to_emu(Mod)
+ after
+ erlang:system_flag(multi_scheduling, unblock)
+ end
+ catch
+ _:_ ->
+ ok
end.
%%========================================================================