From f4c65597ea7b1c148b0b45ca3cf09c4ab76dd39a Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Wed, 24 Oct 2018 15:42:21 +0100 Subject: [PATCH] log 2 compat Need to support math:log2 in early versions of OTP (for Riak) --- rebar.config | 2 ++ src/leveled_math.erl | 38 ++++++++++++++++++++++++++++++++++++++ src/leveled_tictac.erl | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/leveled_math.erl diff --git a/rebar.config b/rebar.config index 7a46b31..a6c6659 100644 --- a/rebar.config +++ b/rebar.config @@ -1,8 +1,10 @@ {erl_opts, [warnings_as_errors, {platform_define, "^2[0-1]{1}", fsm_deprecated}, {platform_define, "^1[7-8]{1}", old_rand}, + {platform_define, "^17", no_log2}, {platform_define, "^R", no_sync}, {platform_define, "^R", old_rand}, + {platform_define, "^R", no_log2}, {platform_define, "^R", slow_test}]}. {xref_checks, [undefined_function_calls,undefined_functions]}. diff --git a/src/leveled_math.erl b/src/leveled_math.erl new file mode 100644 index 0000000..f88ed4f --- /dev/null +++ b/src/leveled_math.erl @@ -0,0 +1,38 @@ +%% Handle missing log2 prior to OTP18 + +-module(leveled_math). + +%% API +-export([ + log2/1 + ]). + + +-include_lib("eunit/include/eunit.hrl"). + +%%%=================================================================== +%%% Use log2 +%%%=================================================================== +-ifndef(no_log2). + +log2(X) -> + math:log2(X). + +-else. +%%%=================================================================== +%%% Old (r18) random style functions +%%%=================================================================== + +log2(X) -> + math:log(X) / 0.6931471805599453. + +-endif. + + +-ifdef(TEST). + +log2_test() -> + ?assertMatch(8, round(log2(256))), + ?assertMatch(16, round(log2(65536))). + +-endif. diff --git a/src/leveled_tictac.erl b/src/leveled_tictac.erl index 85ada1d..e9716c0 100644 --- a/src/leveled_tictac.erl +++ b/src/leveled_tictac.erl @@ -413,7 +413,7 @@ adjust_segmentmatch_list(SegmentList, CompareSize, StoreSize) -> StoreSizeI = get_size(StoreSize), if CompareSizeI =< StoreSizeI -> ExpItems = StoreSizeI div CompareSizeI - 1, - ShiftFactor = trunc(math:log2(CompareSizeI * ?L2_CHUNKSIZE)), + ShiftFactor = round(leveled_math:log2(CompareSizeI * ?L2_CHUNKSIZE)), ExpList = lists:map(fun(X) -> X bsl ShiftFactor end, lists:seq(1, ExpItems)), UpdSegmentList =