Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potatosalad/fc357e1e06c62480e1de4b457293105d to your computer and use it in GitHub Desktop.
Save potatosalad/fc357e1e06c62480e1de4b457293105d to your computer and use it in GitHub Desktop.
trigger-otp-24-persistent-term-bug.erl
N = 8000,
Terms = [{{a, list_to_atom(integer_to_list(I))}, I} || I <- lists:seq(1, N)],
Add = fun Add([]) -> ok; Add([{K, V} | T]) -> persistent_term:put(K, V), Add(T) end,
Len = fun() -> length(persistent_term:get()) end,
Random = fun() -> PTerms = [{X, Y} || {{a, X}, Y} <- persistent_term:get()], lists:nth(rand:uniform(length(PTerms)), PTerms) end,
DelRandom = fun() -> Key = element(1, Random()), persistent_term:erase({a, Key}), Key end,
EraserFun = fun() -> Eraser = fun Eraser() -> receive _ -> Eraser() after 1 -> DelRandom(), Eraser() end end, Eraser() end,
WriterFun = fun() -> Writer = fun Writer() -> receive _ -> Writer() after 1 -> Add(Terms), Writer() end end, Writer() end,
ReportFun = fun() -> Report = fun Report() -> io:format("there are ~w persistent terms~n", [Len()]), receive _ -> Report() after 1000 -> Report() end end, Report() end,
Add(Terms),
ReportPid = spawn_link(ReportFun),
WriterPid = spawn_link(WriterFun),
EraserPids = [spawn_link(EraserFun) || _ <- lists:seq(1, N)],
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment