diff options
Diffstat (limited to 'lib/kernel')
| -rw-r--r-- | lib/kernel/src/application_master.erl | 9 | ||||
| -rw-r--r-- | lib/kernel/src/disk_log.erl | 18 | ||||
| -rw-r--r-- | lib/kernel/src/file.erl | 43 | ||||
| -rw-r--r-- | lib/kernel/src/file_io_server.erl | 3 | ||||
| -rw-r--r-- | lib/kernel/src/file_server.erl | 3 | ||||
| -rw-r--r-- | lib/kernel/src/inet_gethost_native.erl | 3 | ||||
| -rw-r--r-- | lib/kernel/src/rpc.erl | 24 | ||||
| -rw-r--r-- | lib/kernel/test/file_SUITE.erl | 29 | ||||
| -rw-r--r-- | lib/kernel/test/gen_sctp_SUITE.erl | 3 | 
9 files changed, 56 insertions, 79 deletions
| diff --git a/lib/kernel/src/application_master.erl b/lib/kernel/src/application_master.erl index 679fefaed9..34a3efcaf2 100644 --- a/lib/kernel/src/application_master.erl +++ b/lib/kernel/src/application_master.erl @@ -76,13 +76,8 @@ call(AppMaster, Req) ->  	{'DOWN', Ref, process, _, _Info} ->  	    ok;  	{Tag, Res} -> -	    erlang:demonitor(Ref), -	    receive  -		{'DOWN', Ref, process, _, _Info} ->  -		    Res -	    after 0 -> -		    Res -	    end +	    erlang:demonitor(Ref, [flush]), +	    Res      end.  %%%----------------------------------------------------------------- diff --git a/lib/kernel/src/disk_log.erl b/lib/kernel/src/disk_log.erl index 0c5af2857e..c238eff12f 100644 --- a/lib/kernel/src/disk_log.erl +++ b/lib/kernel/src/disk_log.erl @@ -1914,13 +1914,8 @@ multi_req(Msg, Pids) ->  			    {'DOWN', Ref, process, Pid, _Info} ->  				Reply;  			    {disk_log, Pid, _Reply} -> -				erlang:demonitor(Ref), -				receive  -				    {'DOWN', Ref, process, Pid, _Reason} -> -					ok -				after 0 ->  -					ok -				end +				erlang:demonitor(Ref, [flush]), +				ok  			end  		end, {error, nonode}, Refs). @@ -1965,13 +1960,8 @@ monitor_request(Pid, Req) ->  	    {error, no_such_log};  	{disk_log, Pid, Reply} when not is_tuple(Reply) orelse                                      element(2, Reply) =/= disk_log_stopped -> -	    erlang:demonitor(Ref), -	    receive  -		{'DOWN', Ref, process, Pid, _Reason} -> -		    Reply -	    after 0 -> -                    Reply -	    end +	    erlang:demonitor(Ref, [flush]), +	    Reply      end.  req2(Pid, R) -> diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl index a4c56b346f..36289053eb 100644 --- a/lib/kernel/src/file.erl +++ b/lib/kernel/src/file.erl @@ -480,8 +480,7 @@ open(Item, Mode) ->        Reason :: posix() | badarg | terminated.  close(File) when is_pid(File) -> -    R = file_request(File, close), -    case wait_file_reply(File, R) of +    case file_request(File, close) of  	{error, terminated} ->  	    ok;  	Other -> @@ -503,8 +502,7 @@ close(_) ->        Reason :: posix() | badarg.  advise(File, Offset, Length, Advise) when is_pid(File) -> -    R = file_request(File, {advise, Offset, Length, Advise}), -    wait_file_reply(File, R); +    file_request(File, {advise, Offset, Length, Advise});  advise(#file_descriptor{module = Module} = Handle, Offset, Length, Advise) ->      Module:advise(Handle, Offset, Length, Advise);  advise(_, _, _, _) -> @@ -517,8 +515,7 @@ advise(_, _, _, _) ->        Length :: non_neg_integer().  allocate(File, Offset, Length) when is_pid(File) -> -    R = file_request(File, {allocate, Offset, Length}), -    wait_file_reply(File, R); +    file_request(File, {allocate, Offset, Length});  allocate(#file_descriptor{module = Module} = Handle, Offset, Length) ->      Module:allocate(Handle, Offset, Length). @@ -601,8 +598,7 @@ pread_int(_, _, _) ->        Reason :: posix() | badarg | terminated.  pread(File, At, Sz) when is_pid(File), is_integer(Sz), Sz >= 0 -> -    R = file_request(File, {pread, At, Sz}), -    wait_file_reply(File, R); +    file_request(File, {pread, At, Sz});  pread(#file_descriptor{module = Module} = Handle, Offs, Sz)     when is_integer(Sz), Sz >= 0 ->      Module:pread(Handle, Offs, Sz); @@ -658,8 +654,7 @@ pwrite_int(_, _, _) ->        Reason :: posix() | badarg | terminated.  pwrite(File, At, Bytes) when is_pid(File) -> -    R = file_request(File, {pwrite, At, Bytes}), -    wait_file_reply(File, R); +    file_request(File, {pwrite, At, Bytes});  pwrite(#file_descriptor{module = Module} = Handle, Offs, Bytes) ->      Module:pwrite(Handle, Offs, Bytes);  pwrite(_, _, _) -> @@ -670,8 +665,7 @@ pwrite(_, _, _) ->        Reason :: posix() | badarg | terminated.  datasync(File) when is_pid(File) -> -    R = file_request(File, datasync), -    wait_file_reply(File, R); +    file_request(File, datasync);  datasync(#file_descriptor{module = Module} = Handle) ->      Module:datasync(Handle);  datasync(_) -> @@ -682,8 +676,7 @@ datasync(_) ->        Reason :: posix() | badarg | terminated.  sync(File) when is_pid(File) -> -    R = file_request(File, sync), -    wait_file_reply(File, R); +    file_request(File, sync);  sync(#file_descriptor{module = Module} = Handle) ->      Module:sync(Handle);  sync(_) -> @@ -696,8 +689,7 @@ sync(_) ->        Reason :: posix() | badarg | terminated.  position(File, At) when is_pid(File) -> -    R = file_request(File, {position,At}), -    wait_file_reply(File, R); +    file_request(File, {position,At});  position(#file_descriptor{module = Module} = Handle, At) ->      Module:position(Handle, At);  position(_, _) -> @@ -708,8 +700,7 @@ position(_, _) ->        Reason :: posix() | badarg | terminated.  truncate(File) when is_pid(File) -> -    R = file_request(File, truncate), -    wait_file_reply(File, R); +    file_request(File, truncate);  truncate(#file_descriptor{module = Module} = Handle) ->      Module:truncate(Handle);  truncate(_) -> @@ -1497,25 +1488,19 @@ check_args([]) ->      ok.  %%----------------------------------------------------------------- -%% Functions for communicating with a file io server. +%% Function for communicating with a file io server.  %% The messages sent have the following formats:  %%  %%	{file_request,From,ReplyAs,Request}  %%	{file_reply,ReplyAs,Reply}  file_request(Io, Request) -> -    R = erlang:monitor(process, Io), -    Io ! {file_request,self(),Io,Request}, -    R. - -wait_file_reply(From, Ref) -> +    Ref = erlang:monitor(process, Io), +    Io ! {file_request,self(),Ref,Request},      receive -	{file_reply,From,Reply} -> -	    erlang:demonitor(Ref), -	    receive {'DOWN', Ref, _, _, _} -> ok after 0 -> ok end, -	    %% receive {'EXIT', From, _} -> ok after 0 -> ok end, +	{file_reply,Ref,Reply} -> +	    erlang:demonitor(Ref, [flush]),  	    Reply;  	{'DOWN', Ref, _, _, _} -> -	    %% receive {'EXIT', From, _} -> ok after 0 -> ok end,  	    {error, terminated}      end. diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl index fad2ed7fb3..07fb55f390 100644 --- a/lib/kernel/src/file_io_server.erl +++ b/lib/kernel/src/file_io_server.erl @@ -92,8 +92,7 @@ do_start(Spawn, Owner, FileName, ModeList) ->      Mref = erlang:monitor(process, Pid),      receive  	{Ref, {error, _Reason} = Error} -> -	    erlang:demonitor(Mref), -	    receive {'DOWN', Mref, _, _, _} -> ok after 0 -> ok end, +	    erlang:demonitor(Mref, [flush]),  	    Error;  	{Ref, ok} ->  	    erlang:demonitor(Mref), diff --git a/lib/kernel/src/file_server.erl b/lib/kernel/src/file_server.erl index 49ec6f96cc..d036dbb516 100644 --- a/lib/kernel/src/file_server.erl +++ b/lib/kernel/src/file_server.erl @@ -317,8 +317,7 @@ do_start_slave(start, Filer, Name) ->      SlaveMonitor = erlang:monitor(process, Slave),      receive  	{started, Token} -> -	    erlang:demonitor(SlaveMonitor), -	    receive {'DOWN', SlaveMonitor, _, _, _} -> ok after 0 -> ok end, +	    erlang:demonitor(SlaveMonitor, [flush]),  	    {ok, Slave};  	{'DOWN', SlaveMonitor, _, _, Reason} ->  	    exit(Reason) diff --git a/lib/kernel/src/inet_gethost_native.erl b/lib/kernel/src/inet_gethost_native.erl index db3e44ce6f..df866660b4 100644 --- a/lib/kernel/src/inet_gethost_native.erl +++ b/lib/kernel/src/inet_gethost_native.erl @@ -503,8 +503,7 @@ getit(Req, DefaultName) ->  			Pid, Reason} ->  			   {error, Reason}  		   end, -	    catch erlang:demonitor(Ref2), -	    receive {'DOWN',Ref2,_,_,_} -> ok after 0 -> ok end, +	    catch erlang:demonitor(Ref2, [flush]),  	    Res2      end. diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl index 7c965ca384..83e0b59cc2 100644 --- a/lib/kernel/src/rpc.erl +++ b/lib/kernel/src/rpc.erl @@ -388,13 +388,8 @@ server_call(Node, Name, ReplyWrapper, Msg)  		{'DOWN', Ref, _, _, _} ->  		    {error, nodedown};  		{ReplyWrapper, Node, Reply} -> -		    erlang:demonitor(Ref), -		    receive -			{'DOWN', Ref, _, _, _} -> -			    Reply -		    after 0 -> -			    Reply -		    end +		    erlang:demonitor(Ref, [flush]), +		    Reply  	    end      end. @@ -501,17 +496,6 @@ start_monitor(Node, Name) ->  	    {Node,erlang:monitor(process, {Name, Node})}      end. -%% Cancels a monitor started with Ref=erlang:monitor(_, _), -%% i.e return value {Node, Ref} from start_monitor/2 above. -unmonitor(Ref) when is_reference(Ref) -> -    erlang:demonitor(Ref), -    receive -	{'DOWN', Ref, _, _, _} -> -	    true -    after 0 -> -	    true -    end. -  %% Call apply(M,F,A) on all nodes in parallel  -spec multicall(Module, Function, Args) -> {ResL, BadNodes} when @@ -635,10 +619,10 @@ rec_nodes(Name, [{N,R} | Tail], Badnodes, Replies) ->  	    rec_nodes(Name, Tail, [N|Badnodes], Replies);  	{?NAME, N, {nonexisting_name, _}} ->    	    %% used by sbcast() -	    unmonitor(R), +	    erlang:demonitor(R, [flush]),  	    rec_nodes(Name, Tail, [N|Badnodes], Replies);  	{Name, N, Reply} ->  %% Name is bound !!! -	    unmonitor(R), +	    erlang:demonitor(R, [flush]),  	    rec_nodes(Name, Tail, Badnodes, [Reply|Replies])      end. diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index c604e7073f..4218cfa646 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -91,6 +91,8 @@  -export([standard_io/1,mini_server/1]). +-export([old_io_protocol/1]). +  %% Debug exports  -export([create_file_slow/2, create_file/2, create_bin/2]).  -export([verify_file/2, verify_bin/3]). @@ -114,7 +116,7 @@ all() ->       delayed_write, read_ahead, segment_read, segment_write,       ipread, pid2name, interleaved_read_write, otp_5814, otp_10852,       large_file, large_write, read_line_1, read_line_2, read_line_3, -     read_line_4, standard_io]. +     read_line_4, standard_io, old_io_protocol].  groups() ->       [{dirs, [], [make_del_dir, cur_dir_0, cur_dir_1, @@ -310,6 +312,31 @@ standard_io(Config) when is_list(Config) ->      Pid ! die,      receive after 1000 -> ok end. +old_io_protocol(suite) -> +    []; +old_io_protocol(doc) -> +    ["Test that the old file IO protocol =< R16B still works"]; +old_io_protocol(Config) when is_list(Config) -> +    Dog = test_server:timetrap(test_server:seconds(5)), +    RootDir = ?config(priv_dir,Config), +    Name = filename:join(RootDir, +			 atom_to_list(?MODULE) +			 ++"old_io_protocol.fil"), +    MyData = "0123456789abcdefghijklmnopqrstuvxyz", +    ok = ?FILE_MODULE:write_file(Name, MyData), +    {ok, Fd} = ?FILE_MODULE:open(Name, write), +    Fd ! {file_request,self(),Fd,truncate}, +    receive +	{file_reply,Fd,ok} -> ok +    end, +    ok = ?FILE_MODULE:close(Fd), +    {ok, <<>>} = ?FILE_MODULE:read_file(Name), +    test_server:timetrap_cancel(Dog), +    [] = flush(), +    ok. + + +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  read_write_file(suite) -> []; diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl index 2a886b2efc..c5d8becfd3 100644 --- a/lib/kernel/test/gen_sctp_SUITE.erl +++ b/lib/kernel/test/gen_sctp_SUITE.erl @@ -1399,8 +1399,7 @@ s_req(S, Req) ->  	{'DOWN',Mref,_,_,Error} ->  	    exit(Error);  	{S,Mref,Reply} -> -	    erlang:demonitor(Mref), -	    receive {'DOWN',Mref,_,_,_} -> ok after 0 -> ok end, +	    erlang:demonitor(Mref, [flush]),  	    Reply      end. | 
