Doubt about funs
Ulf Wiger
etxuwig@REDACTED
Wed Feb 21 10:51:21 CET 2001
I basically agree with Martin, but...
On Wed, 21 Feb 2001, Martin Bjorklund wrote:
>"Erik Johansson" <happi@REDACTED> wrote:
>> has the same effect as
>> spawn(m, f, [X1, ..., Xn])
>
>What you describe is not how it works today:
>
>====================================
>-module(t).
>-export([t/0]).
>
>
>t() ->
> spawn(fun() -> loop() end).
>
>loop() ->
> receive
> ok ->
> loop()
> end.
>====================================
>1> c(t).
>{ok,t}
>2> P = t:t().
><0.32.0>
>3> process_info(P, current_function).
>{current_function,{t,loop,0}}
>4> l(t).
>{module,t}
>5> process_info(P, current_function).
>{current_function,{t,loop,0}}
>6> l(t).
>{module,t}
>7> process_info(P, current_function).
>undefined
Erm, what did you intent to demonstrate here?
P crashes, but that doesn't really have anything to do with the
fun. It's because t:loop() executes in the old module.
If you change loop() like this:
loop() ->
receive
ok ->
t:loop()
after 1000 ->
t:loop()
end.
then P won't crash.
Indeed, if you make a stack trace on P, you will see that there is
no reference to the fun on the stack (if I read the stack trace
correctly):
39> erlang:process_display(P, backtrace).
program counter = 0x19a8f4 (t:loop/0 + 4)
cp = 0xed830 (<terminate process normally>)
arity = 0
true
The main gripe about long-lived funs is exactly that they sometimes
surprise you during code change. Upgrades are hard enough as it is.
This could perhaps be remedied -- it's certainly improved a lot
already, compared to you only needed to recompile to break all
references to a fun.
/Uffe
--
Ulf Wiger tfn: +46 8 719 81 95
Senior System Architect mob: +46 70 519 81 95
Strategic Product & System Management ATM Multiservice Networks
Data Backbone & Optical Services Division Ericsson Telecom AB
More information about the erlang-questions
mailing list