ensure_started

Vlad Dumitrescu (EAW) <>
Thu Feb 27 09:49:04 CET 2003


Hi,

I wonder about a thing. The following fun is an often used way to ensure that one uses "the one and only" server called ?MODULE.

ensure_started() ->
    case whereis(?MODULE) of
	undefined ->
	    Pid = proc_lib:spawn(?MODULE, init, []),
	    register(?MODULE, Pid),
	    {ok, Pid};
	Pid ->
	    {ok, Pid}
    end.

Now I just had to implement this functionality and I noticed that the above isn't really correct. In fact, I even got a case during tests when the error showed up.

start() ->
    case whereis(?SERVER) of
	undefined ->
	    Pid = spawn(fun init/0),
	    %% some other process might have already registered it
	    %% since we last checked
	    case catch register(?SERVER, Pid) of
		true ->
		    %% we're the real thing
		    Pid;
		_ ->
		    %% other process got there first, use that one
		    Pid ! stop,
		    %% try again!
		    start()
	    end;
	Pid ->
	    Pid
    end.

I thought to share this, as it might cause confusion. Maybe it's not so often the scheduler will interrrupt start() just in the wrong place, but as I said, it happened to me (in relation with the debugger running).

best regards,
Vlad



More information about the erlang-questions mailing list