Changeset 47


Ignore:
Timestamp:
02/02/09 19:41:02 (3 years ago)
Author:
dom
Message:

Fixed (last?) bug in use_tree, which didn't delete tree if parent process was killed

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/fixtures.erl

    r46 r47  
    7272 
    7373use_tree (Dir, Tree, Fun) -> 
    74     try 
    75         make_tree (Dir, Tree), 
    76         safe_call (Dir, Tree, Fun) 
    77     after 
    78         delete_tree (Dir) 
    79     end. 
    80  
    81 safe_call (Dir, Tree, Fun) -> 
    8274    Self = self (), 
    8375    Pid = spawn_link (fun() -> safe_call (Self, Dir, Tree, Fun) end), 
     
    9082    process_flag (trap_exit, true), 
    9183    Self = self (), 
     84    make_tree (Dir, Tree), 
    9285    Pid = spawn_link (fun () -> Self ! {self (), Fun (Dir, Tree)} end), 
    93     receive 
     86    receive M -> delete_tree (Dir) end, 
     87    case M of 
    9488        {Pid, Result} -> Parent ! {Self, Result}; 
    95         {'EXIT', Pid, Error} -> Parent ! {Self, {'EXIT', Error}} 
     89        {'EXIT', Pid, Error} -> Parent ! {Self, {'EXIT', Error}}; 
     90        _ -> ignore 
    9691    end. 
  • trunk/src/fixtures_test.erl

    r46 r47  
    1111-export ([use_tree_destroys_tree_even_if_fun_crashes/0]). 
    1212-export ([use_tree_destroys_tree_even_if_trapexit/0]). 
     13-export ([use_tree_destroys_tree_even_if_killed_by_parent_link/0]). 
    1314 
    1415temporary_pathname () -> 
     
    2829     {file, "test2", ["Goodbye", "world!"]}, 
    2930     {directory, "testdir", 
    30       [{file, "toto", "Silly"}, {directory, "testdir2", [{file, "titi", "Very silly"}]}]}]. 
     31      [{file, "toto", "Silly"}, 
     32       {directory, "testdir2", [{file, "titi", "Very silly"}]}]}]. 
     33     
     34test_tree (Dir) -> 
     35    fun ({Path, Expected}, Count) -> 
     36            Filename = filename: join ([Dir | Path]), 
     37            {ok, Content} = file: read_file (Filename), 
     38            {Count, Expected} = {Count, binary_to_list (Content)}, 
     39            Count + 1 
     40    end. 
    3141     
    3242tree_handling () -> 
     
    3444    Tree = tree (), 
    3545    fixtures: make_tree (Tmp_dirname, Tree), 
    36     {ok, Content} = file: read_file (filename: join (Tmp_dirname, "test")), 
    37     "Hello world" = binary_to_list (Content), 
    38     {ok, Content2} = file: read_file (filename: join (Tmp_dirname, "test2")), 
    39     "Goodbye\nworld!" = binary_to_list (Content2), 
    40     {ok, Content3} = file: read_file (filename:join ([Tmp_dirname, "testdir", "toto"])), 
    41     "Silly" = binary_to_list (Content3), 
    42     File4 = filename: join ([Tmp_dirname, "testdir", "testdir2", "titi"]), 
    43     {ok, Content4} = file: read_file (File4), 
    44     "Very silly" = binary_to_list (Content4), 
     46    Test = test_tree (Tmp_dirname), 
     47    Table = 
     48        [{["test"], "Hello world"}, 
     49         {["test2"], "Goodbye\nworld!"}, 
     50         {["testdir", "toto"], "Silly"}, 
     51         {["testdir", "testdir2", "titi"], "Very silly"}], 
     52    lists: foldl (Test, 1, Table), 
    4553    fixtures: delete_tree (Tmp_dirname), 
    4654    {error, enoent} = file: read_file_info (Tmp_dirname), 
     
    6068    Result = fixtures: use_tree (Tmp, tree (), fun keep_real_files/2), 
    6169    ["test", "test2", "testdir"] = Result, 
    62     {error,enoent} = file:read_file_info (Tmp), 
     70    {error,enoent} = file: read_file_info (Tmp), 
    6371    pass. 
    6472 
     
    7482            no_crash 
    7583        catch 
    76             _:{suicide, Tmp, Tree} -> ok; 
    77             C:E -> {unexpected, C, E} 
     84            _: {suicide, Tmp, Tree} -> ok; 
     85            C: E -> {unexpected, C, E} 
    7886        end, 
    79     {error, enoent} = file:read_file_info (Tmp), 
     87    {error, enoent} = file: read_file_info (Tmp), 
    8088    pass. 
    8189 
     
    9199            no_crash 
    92100        catch 
    93             _:{undef, _} -> ok; 
     101            _: {undef, _} -> ok; 
    94102            C:E -> {unexpected, C, E} 
    95103        end, 
    96     {error, enoent} = file:read_file_info (Tmp), 
     104    {error, enoent} = file: read_file_info (Tmp), 
    97105    pass. 
    98106 
     
    100108    exit ({suicide, Dir, Tree}). 
    101109     
     110use_tree_destroys_tree_even_if_killed_by_parent_link () -> 
     111    Tmp = fixtures: temporary_pathname (), 
     112    Self = self (), 
     113    ok = 
     114        try 
     115            Long = fun (_, _) -> Self ! tree_built, timer: sleep (5000) end, 
     116            Use_tree = fun () -> fixtures: use_tree (Tmp, [], Long) end, 
     117            Impatient = fun () -> spawn_link (Use_tree), 
     118                                  receive tree_built -> ok end, 
     119                                  throw (stop) end, 
     120            Pid = spawn (Impatient), 
     121            receive tree_built -> Pid ! tree_built end, 
     122            ok 
     123        catch 
     124            C: E -> {unexpected, C, E} 
     125        end, 
     126    timer: sleep (500), 
     127    {error, enoent} = file: read_file_info (Tmp), 
     128    pass. 
Note: See TracChangeset for help on using the changeset viewer.