- Timestamp:
- 07/07/09 11:47:43 (3 years ago)
- File:
-
- 1 edited
-
trunk/src/directory_watcher.erl (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/directory_watcher.erl
r58 r59 29 29 end. 30 30 31 init (Directory, Pid) -> 32 check (Directory, Pid, []). 31 init (Directory, Pid) when is_pid (Pid) -> 32 init (Directory, send (Pid)); 33 init (Directory, F) -> 34 check (Directory, F, []). 33 35 34 init_recursive (Directory, Pid) -> 35 Watcher = spawn_link (?MODULE, init, [Directory, self ()]), 36 loop_recursive (Directory, Pid, [Watcher]). 36 init_recursive (Directory, Pid) when is_pid (Pid) -> 37 init_recursive (Directory, send (Pid)); 38 init_recursive (Directory, F) -> 39 S = self (), 40 Watcher = spawn_link (?MODULE, init, [Directory, S]), 41 loop_recursive (Directory, F, [Watcher]). 37 42 38 check (Directory, Pid, State) ->39 New_state = list_dir (Directory, Pid),40 compare ( Pid, State, New_state),41 loop (Directory, Pid, New_state).43 check (Directory, F, State) -> 44 New_state = list_dir (Directory, F), 45 compare (F, State, New_state), 46 loop (Directory, F, New_state). 42 47 43 list_dir (Directory, Pid) ->44 list_dir (Directory, Pid, file: list_dir (Directory)).48 list_dir (Directory, F) -> 49 list_dir (Directory, F, file: list_dir (Directory)). 45 50 46 51 list_dir (Directory, _, {ok, Filenames}) -> 47 52 Paths = [filename: join (Directory, F) || F <- Filenames], 48 53 read_state (Paths); 49 list_dir (Directory, Pid, Error) ->50 notify (Pid,{directory, Directory, Error}),54 list_dir (Directory, F, Error) -> 55 F ({directory, Directory, Error}), 51 56 []. 52 57 … … 68 73 directory. 69 74 70 loop (Directory, Pid, Filenames) ->75 loop (Directory, F, Filenames) -> 71 76 receive 72 77 check -> 73 check (Directory, Pid, Filenames);78 check (Directory, F, Filenames); 74 79 stop -> 75 notify (Pid,bye)80 F (bye) 76 81 end. 77 82 78 loop_recursive (Directory, Pid, Watchers) ->83 loop_recursive (Directory, F, Watchers) -> 79 84 receive 80 85 {?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]); 84 90 {?MODULE, Watcher, {directory, _, {error, _}}} -> 85 91 Watcher ! stop, 86 loop_recursive (Directory, Pid, Watchers -- [Watcher]);92 loop_recursive (Directory, F, Watchers -- [Watcher]); 87 93 {?MODULE, _, bye} -> 88 loop_recursive (Directory, Pid, Watchers);94 loop_recursive (Directory, F, Watchers); 89 95 {?MODULE, _, Event} -> 90 notify (Pid,Event),91 loop_recursive (Directory, Pid, Watchers);96 F (Event), 97 loop_recursive (Directory, F, Watchers); 92 98 check -> 93 99 lists: foreach (fun (P) -> P ! check end, Watchers), 94 loop_recursive (Directory, Pid, Watchers);100 loop_recursive (Directory, F, Watchers); 95 101 stop -> 96 notify (Pid,bye)102 F (bye) 97 103 end. 98 104 99 105 compare (_, State, State) -> 100 106 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]) ->107 compare (Fun, [X | Xs], [X | Ys]) -> 108 compare (Fun, Xs, Ys); 109 compare (Fun, [{F, {regular, _}} | Xs], [{F, {regular, _}} | Ys]) -> 110 report_changed (Fun, F), 111 compare (Fun, Xs, Ys); 112 compare (Fun, [{F, _}=X | Xs], [{F, _} | Ys]) -> 113 report_lost (Fun, X), 114 report_found (Fun, F), 115 compare (Fun, Xs, Ys); 116 compare (Fun, [X, {F, V} | Xs], [{F, W} | Ys]) -> 117 report_lost (Fun, X), 118 compare (Fun, [{F, V} | Xs], [{F, W} | Ys]); 119 compare (Fun, [{F, V} | Xs], [Y, {F, W} | Ys]) -> 114 120 {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]); 123 compare (Fun, [], [Y | Ys]) -> 118 124 {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); 127 compare (Fun, [X | Xs], []) -> 128 report_lost (Fun, X), 129 compare (Fun, Xs, []); 124 130 compare (_, [], []) -> 125 131 done. 126 132 127 report_found ( Pid, Filename) ->128 notify (Pid,{type (Filename), Filename, found}).133 report_found (F, Filename) -> 134 F ({type (Filename), Filename, found}). 129 135 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}).136 report_lost (F, {Filename, directory}) -> 137 F ({directory, Filename, lost}); 138 report_lost (F, {Filename, {regular, _}}) -> 139 F ({{file, filename: extension (Filename)}, Filename, lost}). 134 140 135 report_changed ( Pid, Filename) ->136 notify (Pid,{type (Filename), Filename, changed}).141 report_changed (F, Filename) -> 142 F ({type (Filename), Filename, changed}). 137 143 138 144 type (Path) -> … … 144 150 {file, filename: extension (Path)}. 145 151 146 notify (Pid, Event) -> 147 Pid ! {?MODULE, self (), Event}. 152 send (Pid) -> 153 fun (Event) -> 154 Pid ! {?MODULE, self (), Event} 155 end. 156
Note: See TracChangeset
for help on using the changeset viewer.
