diff options
author | Anders Svensson <[email protected]> | 2012-11-08 12:55:44 +0100 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2012-11-08 12:55:44 +0100 |
commit | 1262a7cadb69ee503bb5c2586038059b00595c99 (patch) | |
tree | a62327809e844a7a9d08f20a7d1f51754bb6b8b0 /lib/diameter/src/base/diameter_config.erl | |
parent | acdfec8baf27093b59cd25ffbc84e6165f9bb427 (diff) | |
parent | bcc2e7751b014d4fc9d45c4a138278cbd00cc222 (diff) | |
download | otp-1262a7cadb69ee503bb5c2586038059b00595c99.tar.gz otp-1262a7cadb69ee503bb5c2586038059b00595c99.tar.bz2 otp-1262a7cadb69ee503bb5c2586038059b00595c99.zip |
Merge branch 'anders/diameter/sequence_masks/OTP-10445' into maint
* anders/diameter/sequence_masks/OTP-10445:
Redo watchdog test suite
Update/clarify some comments
Add reopen message from watchdog
Add options service_info
Add diameter_reg:wait/1
Clarify diameter_transport doc
Remove pre-OTP configure support
Remove obsolete make target
Use sequence masks in test suites
Implement sequence masks
Document sequence masks
Diffstat (limited to 'lib/diameter/src/base/diameter_config.erl')
-rw-r--r-- | lib/diameter/src/base/diameter_config.erl | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl index d1916c26e6..fc37ca8541 100644 --- a/lib/diameter/src/base/diameter_config.erl +++ b/lib/diameter/src/base/diameter_config.erl @@ -97,6 +97,9 @@ -record(monitor, {mref = make_ref() :: reference(), service}). %% name +%% The default sequence mask. +-define(NOMASK, {0,32}). + %% Time to lay low before restarting a dead service. -define(RESTART_SLEEP, 2000). @@ -549,9 +552,10 @@ make_config(SvcName, Opts) -> ok = encode_CER(COpts), - Os = split(Opts, [{[fun erlang:is_boolean/1], false, share_peers}, - {[fun erlang:is_boolean/1], false, use_shared_peers}, - {[fun erlang:is_pid/1, false], false, monitor}]), + Os = split(Opts, fun opt/2, [{false, share_peers}, + {false, use_shared_peers}, + {false, monitor}, + {?NOMASK, sequence}]), %% share_peers and use_shared_peers are currently undocumented. #service{name = SvcName, @@ -559,6 +563,43 @@ make_config(SvcName, Opts) -> capabilities = Caps}, options = Os}. +split(Opts, F, Defs) -> + [{K, F(K, get_opt(K, Opts, D))} || {D,K} <- Defs]. + +opt(K, false = B) + when K /= sequence -> + B; + +opt(K, true = B) + when K == share_peer; + K == use_shared_peers -> + B; + +opt(monitor, P) + when is_pid(P) -> + P; + +opt(sequence, {_,_} = T) -> + sequence(T); + +opt(sequence, F) -> + try diameter_lib:eval(F) of + T -> sequence(T) + catch + E:R -> + ?THROW({value, {sequence, E, R, ?STACK}}) + end; + +opt(K, _) -> + ?THROW({value, K}). + +sequence({H,N} = T) + when 0 =< N, N =< 32, 0 =< H, 0 == H bsr N -> + T; + +sequence(_) -> + ?THROW({value, sequence}). + make_caps(Caps, Opts) -> case diameter_capx:make_caps(Caps, Opts) of {ok, T} -> @@ -663,21 +704,6 @@ get_opt(Key, List, Def) -> _ -> ?THROW({arity, Key}) end. -split(Opts, Defs) -> - [{K, value(D, Opts)} || {_,_,K} = D <- Defs]. - -value({Preds, Def, Key}, Opts) -> - V = get_opt(Key, Opts, Def), - lists:any(fun(P) -> pred(P,V) end, Preds) - orelse ?THROW({value, Key}), - V. - -pred(F, V) - when is_function(F) -> - F(V); -pred(T, V) -> - T == V. - cb(M,F) -> try M:F() of V -> V |