Spawning processes

Ulf Wiger <>
Fri Feb 14 12:14:03 CET 2003


On Fri, 14 Feb 2003, Vlad Dumitrescu (EAW) wrote:

>Hi,
>
>Since it's friday, I hope I may be excused if I just don't
>see the obvious. Please point it out to me! :-)
>
>I need to have a named process available at all times. The solution I came up with is to have each interface function do something like
>    Pid = start(),
>    Pid ! Msg

>where start() checks if there is a process registered, and
>if not starts it and registers; otherwise the current Pid
>is returned. This works fine, until one tries to do several
>calls in a row to an unexisting process: all try to start
>and register the server, because the registration doesn't
>have time to do it's job...
>
>Is there another way to do something like this? I need to
>introduce this in a working system and don't know from
>which process it will be called first, and also have no
>control over the startup order...

If you could serialize the start commands using a server,
this would solve the problem, but then you might have the
same problem with starting the serialization server. ;)

You could use

Pid = case whereis(Name) of
         undefined ->
            global:trans({{start,Name},self()},
                         fun() ->
                            start()
                         end);
         P when pid(P) ->
            P
      end.

/Uffe
-- 
Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes




More information about the erlang-questions mailing list