diff options
author | Siri Hansen <[email protected]> | 2011-03-23 16:07:03 +0100 |
---|---|---|
committer | Siri Hansen <[email protected]> | 2011-05-12 16:21:07 +0200 |
commit | 99033bc070be6325ccbbb0a3e7e69396c8a30ec9 (patch) | |
tree | aa517ec0cfa8a3358178f293cd7ed6eada782b6c /lib/sasl/src/rb.erl | |
parent | b1e768e86593178810c8a0b3c38443dcf6be5181 (diff) | |
download | otp-99033bc070be6325ccbbb0a3e7e69396c8a30ec9.tar.gz otp-99033bc070be6325ccbbb0a3e7e69396c8a30ec9.tar.bz2 otp-99033bc070be6325ccbbb0a3e7e69396c8a30ec9.zip |
Never fail when stopping rb, and fix file descriptor leak
rb:stop did sometimes return {error,running}.
This came from supervisor:delete_child and happened when the rb_server
has not yet terminated when this function was called. Instead of
having a separate gen_server call to rb_server for stopping the
process, supervisor:terminate_child is now called. This is a
synchronous function - i.e. it waits for the process to actually
terminate before it returns.
A file descriptor leak in rb:scan_files is corrected. The index file
was never closed after reading.
Diffstat (limited to 'lib/sasl/src/rb.erl')
-rw-r--r-- | lib/sasl/src/rb.erl | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/sasl/src/rb.erl b/lib/sasl/src/rb.erl index 13753565d8..500c795721 100644 --- a/lib/sasl/src/rb.erl +++ b/lib/sasl/src/rb.erl @@ -53,7 +53,7 @@ start_link(Options) -> gen_server:start_link({local, rb_server}, rb, Options, []). stop() -> - call(stop), + supervisor:terminate_child(sasl_sup, rb_server), supervisor:delete_child(sasl_sup, rb_server). rescan() -> rescan([]). @@ -205,8 +205,6 @@ handle_call({rescan, Options}, _From, State) -> NewState = State#state{data = Data, max = Max, type = Type, device = Device, abort = Abort, log = Log1}, {reply, ok, NewState}; -handle_call(stop, _From, State) -> - {stop, normal, stopped, State}; handle_call(_, _From, #state{data = undefined}) -> {reply, {error, no_data}, #state{}}; handle_call({list, Type}, _From, State) -> @@ -312,11 +310,14 @@ scan_files(RptDir, Max, Type) -> {ok, Fd} -> case catch file:read(Fd, 1) of {ok, [LastWritten]} -> + file:close(Fd), Files = make_file_list(RptDir, LastWritten), scan_files(RptDir, Files, Max, Type); - _ -> exit("cannot read the index file") + _X -> + file:close(Fd), + exit("cannot read the index file") end; - _ -> exit("cannot read the index file") + _X -> exit("cannot read the index file") end. make_file_list(Dir, FirstFileNo) -> |