11defmodule Mix.State do
22 @ moduledoc false
33 @ name __MODULE__
4- @ timeout :infinity
54
6- use Agent
5+ use GenServer
76
87 def start_link ( _opts ) do
9- Agent . start_link ( __MODULE__ , :init , [ ] , name: @ name )
8+ GenServer . start_link ( __MODULE__ , :ok , name: @ name )
109 end
1110
12- def init ( ) do
13- % {
11+ @ impl true
12+ def init ( :ok ) do
13+ table = :ets . new ( @ name , [ :public , :set , :named_table , read_concurrency: true ] )
14+
15+ :ets . insert ( table ,
1416 shell: Mix.Shell.IO ,
1517 env: from_env ( "MIX_ENV" , :dev ) ,
1618 target: from_env ( "MIX_TARGET" , :host ) ,
17- scm: [ Mix.SCM.Git , Mix.SCM.Path ] ,
18- cache: :ets . new ( @ name , [ :public , :set , :named_table , read_concurrency: true ] )
19- }
19+ scm: [ Mix.SCM.Git , Mix.SCM.Path ]
20+ )
21+
22+ { :ok , table }
2023 end
2124
2225 defp from_env ( varname , default ) do
@@ -28,50 +31,43 @@ defmodule Mix.State do
2831 end
2932
3033 def fetch ( key ) do
31- Agent . get ( @ name , Map , :fetch , [ key ] , @ timeout )
34+ case :ets . lookup ( @ name , key ) do
35+ [ { ^ key , value } ] -> { :ok , value }
36+ [ ] -> :error
37+ end
3238 end
3339
3440 def get ( key , default \\ nil ) do
35- Agent . get ( @ name , Map , :get , [ key , default ] , @ timeout )
41+ case :ets . lookup ( @ name , key ) do
42+ [ { ^ key , value } ] -> value
43+ [ ] -> default
44+ end
3645 end
3746
3847 def put ( key , value ) do
39- Agent . update ( @ name , Map , :put , [ key , value ] , @ timeout )
40- end
41-
42- def prepend_scm ( value ) do
43- Agent . update (
44- @ name ,
45- fn state -> update_in ( state . scm , & [ value | List . delete ( & 1 , value ) ] ) end ,
46- @ timeout
47- )
48+ :ets . insert ( @ name , { key , value } )
4849 end
4950
50- def append_scm ( value ) do
51- Agent . update (
52- @ name ,
53- fn state -> update_in ( state . scm , & ( List . delete ( & 1 , value ) ++ [ value ] ) ) end ,
54- @ timeout
55- )
51+ def update ( key , fun ) do
52+ :ets . insert ( @ name , { key , fun . ( :ets . lookup_element ( @ name , key , 2 ) ) } )
5653 end
5754
5855 def read_cache ( key ) do
59- case :ets . lookup ( @ name , key ) do
60- [ { ^ key , value } ] -> value
61- [ ] -> nil
62- end
56+ :persistent_term . get ( { __MODULE__ , key } , nil )
6357 end
6458
6559 def write_cache ( key , value ) do
66- :ets . insert ( @ name , { key , value } )
60+ :persistent_term . put ( { __MODULE__ , key } , value )
6761 value
6862 end
6963
7064 def delete_cache ( key ) do
71- :ets . delete ( @ name , key )
65+ :persistent_term . erase ( { __MODULE__ , key } )
7266 end
7367
7468 def clear_cache do
75- :ets . delete_all_objects ( @ name )
69+ for { { __MODULE__ , _ } = key , _value } <- :persistent_term . get ( ) do
70+ :persistent_term . erase ( key )
71+ end
7672 end
7773end
0 commit comments