Changeset 59 for trunk


Ignore:
Timestamp:
07/07/09 11:47:43 (3 years ago)
Author:
dom
Message:

Refactored directory_watcher to take a fun instead of a pid

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/directory_watcher.erl

    r58 r59  
    2929    end. 
    3030 
    31 init (Directory, Pid) -> 
    32     check (Directory, Pid, []). 
     31init (Directory, Pid) when is_pid (Pid) -> 
     32    init (Directory, send (Pid)); 
     33init (Directory, F) -> 
     34    check (Directory, F, []). 
    3335 
    34 init_recursive (Directory, Pid) -> 
    35     Watcher = spawn_link (?MODULE, init, [Directory, self ()]), 
    36     loop_recursive (Directory, Pid, [Watcher]). 
     36init_recursive (Directory, Pid) when is_pid (Pid) -> 
     37    init_recursive (Directory, send (Pid)); 
     38init_recursive (Directory, F) -> 
     39    S = self (), 
     40    Watcher = spawn_link (?MODULE, init, [Directory, S]), 
     41    loop_recursive (Directory, F, [Watcher]). 
    3742 
    38 check (Directory, Pid, State) -> 
    39     New_state = list_dir (Directory, Pid), 
    40     compare (Pid, State, New_state), 
    41     loop (Directory, Pid, New_state). 
     43check (Directory, F, State) -> 
     44    New_state = list_dir (Directory, F), 
     45    compare (F, State, New_state), 
     46    loop (Directory, F, New_state). 
    4247 
    43 list_dir (Directory, Pid) -> 
    44     list_dir (Directory, Pid, file: list_dir (Directory)). 
     48list_dir (Directory, F) -> 
     49    list_dir (Directory, F, file: list_dir (Directory)). 
    4550 
    4651list_dir (Directory, _, {ok, Filenames}) -> 
    4752    Paths = [filename: join (Directory, F) || F <- Filenames], 
    4853    read_state (Paths); 
    49 list_dir (Directory, Pid, Error) -> 
    50     notify (Pid, {directory, Directory, Error}), 
     54list_dir (Directory, F, Error) -> 
     55    F ({directory, Directory, Error}), 
    5156    []. 
    5257 
     
    6873    directory. 
    6974 
    70 loop (Directory, Pid, Filenames) -> 
     75loop (Directory, F, Filenames) -> 
    7176    receive 
    7277        check -> 
    73             check (Directory, Pid, Filenames); 
     78            check (Directory, F, Filenames); 
    7479        stop -> 
    75             notify (Pid, bye) 
     80            F (bye) 
    7681    end. 
    7782 
    78 loop_recursive (Directory, Pid, Watchers) -> 
     83loop_recursive (Directory, F, Watchers) -> 
    7984    receive 
    8085        {?MODULE, _, {directory, Dir, found}=Event} -> 
    81             Watcher = spawn_link (?MODULE, init, [Dir, self ()]), 
    82             notify (Pid, Event), 
    83             loop_recursive (Directory, Pid, [Watcher | Watchers]); 
     86            Self = self (), 
     87            Watcher = spawn_link (?MODULE, init, [Dir, send (Self)]), 
     88            F (Event), 
     89            loop_recursive (Directory, F, [Watcher | Watchers]); 
    8490        {?MODULE, Watcher, {directory, _, {error, _}}} -> 
    8591            Watcher ! stop, 
    86             loop_recursive (Directory, Pid, Watchers -- [Watcher]); 
     92            loop_recursive (Directory, F, Watchers -- [Watcher]); 
    8793        {?MODULE, _, bye} -> 
    88             loop_recursive (Directory, Pid, Watchers); 
     94            loop_recursive (Directory, F, Watchers); 
    8995        {?MODULE, _, Event} -> 
    90             notify (Pid, Event), 
    91             loop_recursive (Directory, Pid, Watchers); 
     96            F (Event), 
     97            loop_recursive (Directory, F, Watchers); 
    9298        check -> 
    9399            lists: foreach (fun (P) -> P ! check end, Watchers), 
    94             loop_recursive (Directory, Pid, Watchers); 
     100            loop_recursive (Directory, F, Watchers); 
    95101        stop -> 
    96             notify (Pid, bye) 
     102            F (bye) 
    97103    end. 
    98104 
    99105compare (_, State, State) -> 
    100106    done; 
    101 compare (Pid, [X | Xs], [X | Ys]) -> 
    102     compare (Pid, Xs, Ys); 
    103 compare (Pid, [{F, {regular, _}} | Xs], [{F, {regular, _}} | Ys]) -> 
    104     report_changed (Pid, F), 
    105     compare (Pid, Xs, Ys); 
    106 compare (Pid, [{F, _}=X | Xs], [{F, _} | Ys]) -> 
    107     report_lost (Pid, X), 
    108     report_found (Pid, F), 
    109     compare (Pid, Xs, Ys); 
    110 compare (Pid, [X, {F, V} | Xs], [{F, W} | Ys]) -> 
    111     report_lost (Pid, X), 
    112     compare (Pid, [{F, V} | Xs], [{F, W} | Ys]); 
    113 compare (Pid, [{F, V} | Xs], [Y, {F, W} | Ys]) -> 
     107compare (Fun, [X | Xs], [X | Ys]) -> 
     108    compare (Fun, Xs, Ys); 
     109compare (Fun, [{F, {regular, _}} | Xs], [{F, {regular, _}} | Ys]) -> 
     110    report_changed (Fun, F), 
     111    compare (Fun, Xs, Ys); 
     112compare (Fun, [{F, _}=X | Xs], [{F, _} | Ys]) -> 
     113    report_lost (Fun, X), 
     114    report_found (Fun, F), 
     115    compare (Fun, Xs, Ys); 
     116compare (Fun, [X, {F, V} | Xs], [{F, W} | Ys]) -> 
     117    report_lost (Fun, X), 
     118    compare (Fun, [{F, V} | Xs], [{F, W} | Ys]); 
     119compare (Fun, [{F, V} | Xs], [Y, {F, W} | Ys]) -> 
    114120    {Filename, _} = Y, 
    115     report_found (Pid, Filename), 
    116     compare (Pid, [{F, V} | Xs], [{F, W} | Ys]); 
    117 compare (Pid, [], [Y | Ys]) -> 
     121    report_found (Fun, Filename), 
     122    compare (Fun, [{F, V} | Xs], [{F, W} | Ys]); 
     123compare (Fun, [], [Y | Ys]) -> 
    118124    {Filename, _} = Y, 
    119     report_found (Pid, Filename), 
    120     compare (Pid, [], Ys); 
    121 compare (Pid, [X | Xs], []) -> 
    122     report_lost (Pid, X), 
    123     compare (Pid, Xs, []); 
     125    report_found (Fun, Filename), 
     126    compare (Fun, [], Ys); 
     127compare (Fun, [X | Xs], []) -> 
     128    report_lost (Fun, X), 
     129    compare (Fun, Xs, []); 
    124130compare (_, [], []) -> 
    125131    done. 
    126132 
    127 report_found (Pid, Filename) -> 
    128     notify (Pid, {type (Filename), Filename, found}). 
     133report_found (F, Filename) -> 
     134    F ({type (Filename), Filename, found}). 
    129135 
    130 report_lost (Pid, {Filename, directory}) -> 
    131     notify (Pid, {directory, Filename, lost}); 
    132 report_lost (Pid, {Filename, {regular, _}}) -> 
    133     notify (Pid, {{file, filename: extension (Filename)}, Filename, lost}). 
     136report_lost (F, {Filename, directory}) -> 
     137    F ({directory, Filename, lost}); 
     138report_lost (F, {Filename, {regular, _}}) -> 
     139    F ({{file, filename: extension (Filename)}, Filename, lost}). 
    134140 
    135 report_changed (Pid, Filename) -> 
    136     notify (Pid, {type (Filename), Filename, changed}). 
     141report_changed (F, Filename) -> 
     142    F ({type (Filename), Filename, changed}). 
    137143     
    138144type (Path) -> 
     
    144150    {file, filename: extension (Path)}. 
    145151 
    146 notify (Pid, Event) -> 
    147     Pid ! {?MODULE, self (), Event}. 
     152send (Pid) -> 
     153    fun (Event) -> 
     154            Pid ! {?MODULE, self (), Event} 
     155    end. 
     156 
Note: See TracChangeset for help on using the changeset viewer.