[erlang-questions] Erlang way for process-as-library?
Mats Cronqvist
mats.cronqvist@REDACTED
Wed Feb 7 12:35:34 CET 2007
Hakan Mattsson wrote:
> On Wed, 7 Feb 2007, Mats Cronqvist wrote:
>
> MC> Hakan Mattsson wrote:
> MC> > On Tue, 6 Feb 2007, Robert Virding wrote:
> MC> >
> MC> > RV> Torbjorn Tornkvist wrote:
> MC> > RV> > Either let the users of the library start it with
> MC> > RV> > a start function or you could let every function
> MC> > RV> > do it automatically. Example:
> MC> > RV> >
> MC> > RV> > start() ->
> MC> > RV> > case whereis(my_service) of
> MC> > RV> > Pid when pid(Pid) -> Pid
> MC> > RV> > _ -> spawn(my_mod, my_server, [])
> MC> > RV> > end.
> MC> > RV>
> MC> > RV> That start function is not safe, especially on an SMP system. You could
> MC> > RV> get two rocesses running start simultaneously both not finding the
> MC> > RV> server and both trying to start it.
> MC> >
> MC> > The start function is safe. Only one of the processes
> MC> > will succeed in registering the name my_service.
> MC>
> MC> it's not safe if start/0 is supposed to return the pid of the server.
>
> Ok it is not safe in that particular regard if the pid
> really is intended to be used, but as Tobbe did not use
> in his example I assumed that that it was not intended
> to be used.
i think it's clear from tobbes code that he intended it to return the correct
pid. and i think it should.
> If it is important that the correct pid
> is returned you will need to change the example to:
> start() ->
> case whereis(my_service) of
> Pid when pid(Pid) ->
> Pid
> _ ->
> spawn(my_mod, my_server, []),
> whereis(my_service)
> end.
the second whereis/1 will (likely) run before the register/2 call (presumably
present) in my_mod:my_server/0, and so will return undefined.
> Then of course you may extend the example to also
> handle the case when the process crashes in its
> startup. But neither that nor the problem that you
> pointed out has nothing to do with the problem that
> Robert mentioned.
true enough. it's the server instances problem to figure out if there is
already another instance running.
> MC> this is also not safe;
> MC>
> MC> my_service:start(),
> MC> my_service ! hello.
>
> In which regard is it not safe?
the same reason as above; the send/2 ("!") will (likely) run before the
register/2 (since the spawned process will likely not run immediately), and so
will exit with badarg.
mats
More information about the erlang-questions
mailing list