Compare commits

...

2 Commits

Author SHA1 Message Date
2c160b83a1 Merge pull request 'Let workers finish old candidates.' (#5) from spivee/patience into master
Reviewed-on: #5
Reviewed-by: Craig Everett <craigeverett@qpq.swiss>
Reviewed-by: Ulf Wiger <ulfwiger@qpq.swiss>
2025-05-28 18:27:18 +09:00
Jarvis Carroll
0ff5c4aba1 Let workers finish old candidates.
In the short term this short circuits the headaches around freeing
memory across remote processes, and in the medium to long term
this allows lower-power users to introduce micro-forks instead of
being locked out of the game altogether.
2025-05-28 18:48:27 +10:00

View File

@ -107,8 +107,10 @@ handle_cast({from_pool, #{via := Connector,
%% We could check whether we have already received the candidate ...
%% For now, stop all workers, restart with new candidate
try
Workers1 = stop_workers(Workers),
{Workers2, Cand1} = assign_nonces(Workers1, Cand),
% Most of the time we don't want to stop the worker. If we do, though, then
% we need to do it more carefully than this, or memory usage will triple.
% Workers1 = stop_workers(Workers),
{Workers2, Cand1} = assign_nonces(Workers, Cand),
#st{candidate = Cand2} = S1 = maybe_request_nonces(S#st{candidate = Cand1}),
NewWorkers = [spawn_worker(W, Cand2) || W <- Workers2],
{noreply, S1#st{workers = NewWorkers}}
@ -371,7 +373,10 @@ spawn_worker(#worker{pid = undefined, nonce = Nonce, config = Cfg} = W, Cand) ->
init_worker(Data, Nonce, Target, Cfg1, Me)
end),
MRef = erlang:monitor(process, Pid),
W#worker{pid = Pid, mref = MRef, cand = Cand, nonce = Nonce}.
W#worker{pid = Pid, mref = MRef, cand = Cand, nonce = Nonce};
spawn_worker(W, _) ->
% Worker already has work. Don't disturb it.
W.
-spec init_worker(binary(), integer(), integer(), tuple(), pid()) -> no_return().
init_worker(Data, Nonce, Target, Config, Parent) ->