diff options
Diffstat (limited to 'lib/compiler/test/compilation_SUITE_data/otp_5235.erl')
-rw-r--r-- | lib/compiler/test/compilation_SUITE_data/otp_5235.erl | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5235.erl b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl new file mode 100644 index 0000000000..1c918cdf9d --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl @@ -0,0 +1,84 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5235). +-export([?MODULE/0]). + +-record(commit, {node, + decision, % presume_commit | Decision + ram_copies = [], + disc_copies = [], + disc_only_copies = [], + snmp = [], + schema_ops = [self(),make_ref()] + }). + +?MODULE() -> + process_flag(trap_exit, true), + N = 1024, + clone(N), + wait(N). + +wait(0) -> ok; +wait(N) -> + receive + {'EXIT',_,normal} -> + wait(N-1); + Other -> + exit(Other) + end. + +clone(0) -> ok; +clone(N) -> + spawn_link(fun worker/0), + clone(N-1). + +worker() -> + Seq = lists:seq(1, 10), + PidList = [{N,self()} || N <- Seq], + Commit = #commit{ram_copies=PidList,disc_copies=[], + disc_only_copies=[],snmp=[]}, + List = lists:duplicate(2, Commit), + verify(run(2, List)). + +verify([#commit{node=true,ram_copies=L}|T]) -> + verify_1(L, 1), + verify(T); +verify([]) -> ok. + +verify_1([{N,Pid}|T], N) when Pid =:= self() -> + verify_1(T, N+1); +verify_1([], _) -> ok. + +run(0, L) -> L; +run(N, L) -> run(N-1, reverse(L)). + +reverse([]) -> []; +reverse([H|R]) when record(H, commit) -> + [H#commit{ + ram_copies = lists:reverse(H#commit.ram_copies), + disc_copies = lists:reverse(H#commit.disc_copies), + disc_only_copies = lists:reverse(H#commit.disc_only_copies), + snmp = lists:reverse(H#commit.snmp), + node = erlang:yield() + } + | reverse(R)]. + + + + |