[erlang-questions] Why does adding an io:format call make my accept socket remain valid?
Sun Mar 27 11:31:49 CEST 2016
Like Nathaniel said, the eunit test should involve gen_server. Do not test
handle_cast/2 directly. Instead, run your test on an exported function
(say: Module:accept/0) which in turn should execute:
You can start a gen_server process, execute such tests and shut it down
properly using 'setup' Fixture: http://learnyousomeerlang.com/eunit#fixtures
On Sun, Mar 27, 2016 at 10:15 AM, Nathaniel Waisbrot <
> I don't know about your garbage-collection question, but:
> > Why does that io:format/3 call (only when after the spawn/3 call) keep
> the socket open and active for the spawned process? I wouldn't expect it
> to be garbage collected because the spawned process holds a reference to it
> (and even adding it to the State in the return doesn't fix it). Only other
> thing I could think of was that handle_cast is run in it's own process
> which closes the socket when it dies (since it has ownership), but that
> doesn't make sense from what I've read about OTP.
> Normally handle_cast would be run in the gen_server's process (since
> that's the whole point), but it looks to me like in your test:
> > spawn_link(fun () -> tcp_listener_server:handle_cast(accept, State)
> you are bypassing gen_server and instead ... telling handle_cast to run in
> its own one-off process.
> Do you mean to be doing this? In your test code, you could call
> gen_server:start/1 and then gen_server:cast/2 and get the actual gen_server
> erlang-questions mailing list
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the erlang-questions