[erlang-questions] Concurrent compile

Dominic Williams <>
Fri Apr 20 00:52:29 CEST 2007


Hello,

Running the following module on a directory that contains several 
correct .erl files seems to demonstrate that compile:file/2 cannot be 
called concurrently. Is that normal? I could not find any mention of it 
in the documentation.

-module (pcompile).
-export ([run/1]).

run(Dir) ->
    {{sync_errors, sync_errors(Dir)},
     {async_errors, async_errors(Dir)}}.

sync_errors(Dir) ->
    lists:filter(
      fun is_error/1,
      filelib:fold_files(Dir, "\\.erl$", false, fun sync/2, [])).

async_errors(Dir) ->
    Pids = filelib:fold_files(Dir, "\\.erl$", false, fun async/2, []),
    Results = [receive M -> M after 1000 -> timeout end || _ <- Pids],
    lists:filter(
      fun is_error/1,
      Results).

is_error({ok, _, _}) -> false;
is_error({error, _, _}) -> true.

sync(File, Acc) ->
    [compile(File) | Acc].

async(File, Acc) ->
    Self = self(),
    Compile = fun() -> R = compile(File), Self ! R end,
    [spawn (Compile) | Acc].

compile(File) ->
    compile:file(File, [return]).


Example output (Mac OS X):

Eshell V5.4.12  (abort with ^G)
1> pcompile:run("tmp").
pcompile:run("tmp").
{{sync_errors,[]},
 {async_errors,[{error,[{"tmp/nw.erl",
                         [{none,compile,
                                {crash,
                                    parse_module,
                                    {badarg,
                                        [{ets,
                                             new,
                                             [compiler__tab,[...]]},
                                         {compile,parse_module,1},
                                         {compile,
                                             
'-internal_comp/4-anonymous-1-',
                                             2},
                                         {compile,fold_comp,3},
                                         {compile,internal_comp|...},
                                         {compile|...}]}}}]}],
                       []},
                {error,[{"tmp/foo.erl",
                         [{none,compile,
                                {crash,
                                    parse_module,
                                    {badarg,
                                        [{ets,new,[compiler__tab,[...]]},
                                         {compile,parse_module,1},
                                         {compile,
                                             
'-internal_comp/4-anonymous-1-'|...},
                                         {compile,fold_comp|...},
                                         {compile|...},
                                         {...}]}}}]}],
                       []}]}}
2>

Regards,

Dominic Williams
http://www.dominicwilliams.net

----



More information about the erlang-questions mailing list