Skip to content

Commit

Permalink
adjust EvaluateActions lock timing
Browse files Browse the repository at this point in the history
  • Loading branch information
longfin committed Apr 25, 2019
1 parent f48bc82 commit a0ae57f
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions Libplanet/Blockchain/BlockChain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,15 @@ public void Append(Block<T> block, DateTimeOffset currentTime)
throw e;
}

IImmutableDictionary<Address, object> nextStates =
EvaluateActions(block);
_rwlock.EnterWriteLock();
try
{
Blocks[block.Hash] = block;
EvaluateActions(block);
Store.SetBlockStates(
block.Hash,
new AddressStateMap(nextStates));

Store.AppendIndex(Id.ToString(), block.Hash);
ISet<TxId> txIds = block.Transactions
Expand Down Expand Up @@ -481,7 +485,8 @@ internal void Swap(BlockChain<T> other)
}
}

private void EvaluateActions(Block<T> block)
private IImmutableDictionary<Address, object>
EvaluateActions(Block<T> block)
{
HashDigest<SHA256>? prevHash = block.PreviousHash;
IAccountStateDelta[] deltas = block.EvaluateActions(address =>
Expand All @@ -504,18 +509,13 @@ private void EvaluateActions(Block<T> block)
ImmutableHashSet<Address>.Empty,
(a, b) => a.Union(b)
);
IImmutableDictionary<Address, object> totalDelta =
updatedAddresses.Select(
a => new KeyValuePair<Address, object>(
a,
lastStates?.GetState(a)
)
).ToImmutableDictionary();

Store.SetBlockStates(
block.Hash,
new AddressStateMap(totalDelta)
);
return updatedAddresses.Select(
a => new KeyValuePair<Address, object>(
a,
lastStates?.GetState(a)
)
).ToImmutableDictionary();
}
}
}

0 comments on commit a0ae57f

Please sign in to comment.