diff options
author | Björn Gustavsson <[email protected]> | 2010-04-22 10:07:18 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-05-11 08:54:25 +0200 |
commit | 1d3148a8532b9319265fbe4107cdde81b554b3a2 (patch) | |
tree | a50fdf410315ed0224a38ef25327af7fbdc6311d /lib/compiler/src/compile.erl | |
parent | d60f055697cfe8e7f94be4d291d49bb00a66bc52 (diff) | |
download | otp-1d3148a8532b9319265fbe4107cdde81b554b3a2.tar.gz otp-1d3148a8532b9319265fbe4107cdde81b554b3a2.tar.bz2 otp-1d3148a8532b9319265fbe4107cdde81b554b3a2.zip |
Optimize selective receives in the presence of a large message queue
If a gen_server process has many messages in its message queue and
calls another gen_server process, the selective receive in
gen_server:call() will have to go through the entire message queue.
Have the compiler generate the new mark_recv/1 and mark_recv/1
instructions that can avoid going through the entire message queue.
Diffstat (limited to 'lib/compiler/src/compile.erl')
-rw-r--r-- | lib/compiler/src/compile.erl | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index 5017fd2c23..3f250a6d5a 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -162,6 +162,10 @@ expand_opt(report, Os) -> [report_errors,report_warnings|Os]; expand_opt(return, Os) -> [return_errors,return_warnings|Os]; +expand_opt(r12, Os) -> + [no_recv_opt|Os]; +expand_opt(r13, Os) -> + [no_recv_opt|Os]; expand_opt({debug_info_key,_}=O, Os) -> [encrypt_debug_info,O|Os]; expand_opt(no_float_opt, Os) -> @@ -621,6 +625,8 @@ asm_passes() -> {iff,dclean,{listing,"clean"}}, {unless,no_bsm_opt,{pass,beam_bsm}}, {iff,dbsm,{listing,"bsm"}}, + {unless,no_recv_opt,{pass,beam_receive}}, + {iff,drecv,{listing,"recv"}}, {unless,no_stack_trimming,{pass,beam_trim}}, {iff,dtrim,{listing,"trim"}}, {pass,beam_flatten}]}, |