Skip to content

Commit 7d73f58

Browse files
committed
Increase threadsafety annotation coverage
1 parent 9db941d commit 7d73f58

12 files changed

+101
-86
lines changed

src/checkqueue.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class CCheckQueue
6666
bool m_request_stop GUARDED_BY(m_mutex){false};
6767

6868
/** Internal function that does bulk of the verification work. */
69-
bool Loop(bool fMaster)
69+
bool Loop(bool fMaster) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
7070
{
7171
std::condition_variable& cond = fMaster ? m_master_cv : m_worker_cv;
7272
std::vector<T> vChecks;
@@ -140,7 +140,7 @@ class CCheckQueue
140140
}
141141

142142
//! Create a pool of new worker threads.
143-
void StartWorkerThreads(const int threads_num)
143+
void StartWorkerThreads(const int threads_num) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
144144
{
145145
{
146146
LOCK(m_mutex);
@@ -159,13 +159,13 @@ class CCheckQueue
159159
}
160160

161161
//! Wait until execution finishes, and return whether all evaluations were successful.
162-
bool Wait()
162+
bool Wait() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
163163
{
164164
return Loop(true /* master thread */);
165165
}
166166

167167
//! Add a batch of checks to the queue
168-
void Add(std::vector<T>& vChecks)
168+
void Add(std::vector<T>& vChecks) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
169169
{
170170
if (vChecks.empty()) {
171171
return;
@@ -188,7 +188,7 @@ class CCheckQueue
188188
}
189189

190190
//! Stop all of the worker threads.
191-
void StopWorkerThreads()
191+
void StopWorkerThreads() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
192192
{
193193
WITH_LOCK(m_mutex, m_request_stop = true);
194194
m_worker_cv.notify_all();

src/httpserver.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class WorkQueue
8787
{
8888
}
8989
/** Enqueue a work item */
90-
bool Enqueue(WorkItem* item)
90+
bool Enqueue(WorkItem* item) EXCLUSIVE_LOCKS_REQUIRED(!cs)
9191
{
9292
LOCK(cs);
9393
if (!running || queue.size() >= maxDepth) {
@@ -98,7 +98,7 @@ class WorkQueue
9898
return true;
9999
}
100100
/** Thread function */
101-
void Run()
101+
void Run() EXCLUSIVE_LOCKS_REQUIRED(!cs)
102102
{
103103
while (true) {
104104
std::unique_ptr<WorkItem> i;
@@ -115,7 +115,7 @@ class WorkQueue
115115
}
116116
}
117117
/** Interrupt and exit loops */
118-
void Interrupt()
118+
void Interrupt() EXCLUSIVE_LOCKS_REQUIRED(!cs)
119119
{
120120
LOCK(cs);
121121
running = false;

src/i2p.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Session
8484
* to the listening socket and address.
8585
* @return true on success
8686
*/
87-
bool Listen(Connection& conn);
87+
bool Listen(Connection& conn) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
8888

8989
/**
9090
* Wait for and accept a new incoming connection.
@@ -103,7 +103,7 @@ class Session
103103
* it is set to `false`. Only set if `false` is returned.
104104
* @return true on success
105105
*/
106-
bool Connect(const CService& to, Connection& conn, bool& proxy_error);
106+
bool Connect(const CService& to, Connection& conn, bool& proxy_error) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
107107

108108
private:
109109
/**
@@ -172,7 +172,7 @@ class Session
172172
/**
173173
* Check the control socket for errors and possibly disconnect.
174174
*/
175-
void CheckControlSock();
175+
void CheckControlSock() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);
176176

177177
/**
178178
* Generate a new destination with the SAM proxy and set `m_private_key` to it.

src/index/blockfilterindex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class BlockFilterIndex final : public BaseIndex
6464
bool LookupFilter(const CBlockIndex* block_index, BlockFilter& filter_out) const;
6565

6666
/** Get a single filter header by block. */
67-
bool LookupFilterHeader(const CBlockIndex* block_index, uint256& header_out);
67+
bool LookupFilterHeader(const CBlockIndex* block_index, uint256& header_out) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_headers_cache);
6868

6969
/** Get a range of filters between two heights on a chain. */
7070
bool LookupFilterRange(int start_height, const CBlockIndex* stop_index,

src/net.h

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ class CNode
613613
* @return True if the peer should stay connected,
614614
* False if the peer should be disconnected from.
615615
*/
616-
bool ReceiveMsgBytes(Span<const uint8_t> msg_bytes, bool& complete);
616+
bool ReceiveMsgBytes(Span<const uint8_t> msg_bytes, bool& complete) EXCLUSIVE_LOCKS_REQUIRED(!cs_vRecv);
617617

618618
void SetCommonVersion(int greatest_common_version)
619619
{
@@ -625,9 +625,9 @@ class CNode
625625
return m_greatest_common_version;
626626
}
627627

628-
CService GetAddrLocal() const LOCKS_EXCLUDED(m_addr_local_mutex);
628+
CService GetAddrLocal() const EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex);
629629
//! May not be called more than once
630-
void SetAddrLocal(const CService& addrLocalIn) LOCKS_EXCLUDED(m_addr_local_mutex);
630+
void SetAddrLocal(const CService& addrLocalIn) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex);
631631

632632
CNode* AddRef()
633633
{
@@ -640,9 +640,9 @@ class CNode
640640
nRefCount--;
641641
}
642642

643-
void CloseSocketDisconnect();
643+
void CloseSocketDisconnect() EXCLUSIVE_LOCKS_REQUIRED(!m_sock_mutex);
644644

645-
void CopyStats(CNodeStats& stats);
645+
void CopyStats(CNodeStats& stats) EXCLUSIVE_LOCKS_REQUIRED(!m_subver_mutex, !m_addr_local_mutex, !cs_vSend, !cs_vRecv);
646646

647647
ServiceFlags GetLocalServices() const
648648
{
@@ -761,7 +761,7 @@ class CConnman
761761
bool m_i2p_accept_incoming;
762762
};
763763

764-
void Init(const Options& connOptions) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
764+
void Init(const Options& connOptions) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_total_bytes_sent_mutex)
765765
{
766766
AssertLockNotHeld(m_total_bytes_sent_mutex);
767767

@@ -795,7 +795,8 @@ class CConnman
795795
bool network_active = true);
796796

797797
~CConnman();
798-
bool Start(CScheduler& scheduler, const Options& options) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
798+
799+
bool Start(CScheduler& scheduler, const Options& options) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !m_added_nodes_mutex, !m_addr_fetches_mutex, !mutexMsgProc);
799800

800801
void StopThreads();
801802
void StopNodes();
@@ -805,7 +806,7 @@ class CConnman
805806
StopNodes();
806807
};
807808

808-
void Interrupt();
809+
void Interrupt() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
809810
bool GetNetworkActive() const { return fNetworkActive; };
810811
bool GetUseAddrmanOutgoing() const { return m_use_addrman_outgoing; };
811812
void SetNetworkActive(bool active);
@@ -872,9 +873,9 @@ class CConnman
872873
// Count the number of block-relay-only peers we have over our limit.
873874
int GetExtraBlockRelayCount() const;
874875

875-
bool AddNode(const std::string& node);
876-
bool RemoveAddedNode(const std::string& node);
877-
std::vector<AddedNodeInfo> GetAddedNodeInfo() const;
876+
bool AddNode(const std::string& node) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
877+
bool RemoveAddedNode(const std::string& node) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
878+
std::vector<AddedNodeInfo> GetAddedNodeInfo() const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
878879

879880
/**
880881
* Attempts to open a connection. Currently only used from tests.
@@ -927,7 +928,7 @@ class CConnman
927928

928929
unsigned int GetReceiveFloodSize() const;
929930

930-
void WakeMessageHandler();
931+
void WakeMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
931932

932933
/** Return true if we should disconnect the peer for failing an inactivity check. */
933934
bool ShouldRunInactivityChecks(const CNode& node, std::chrono::seconds now) const;
@@ -954,11 +955,11 @@ class CConnman
954955
bool Bind(const CService& addr, unsigned int flags, NetPermissionFlags permissions);
955956
bool InitBinds(const Options& options);
956957

957-
void ThreadOpenAddedConnections();
958-
void AddAddrFetch(const std::string& strDest);
959-
void ProcessAddrFetch();
960-
void ThreadOpenConnections(std::vector<std::string> connect);
961-
void ThreadMessageHandler();
958+
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex);
959+
void AddAddrFetch(const std::string& strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex);
960+
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex);
961+
void ThreadOpenConnections(std::vector<std::string> connect) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_added_nodes_mutex, !m_nodes_mutex);
962+
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc);
962963
void ThreadI2PAcceptIncoming();
963964
void AcceptConnection(const ListenSocket& hListenSocket);
964965

@@ -1009,7 +1010,7 @@ class CConnman
10091010
/**
10101011
* Check connected and listening sockets for IO readiness and process them accordingly.
10111012
*/
1012-
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
1013+
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc);
10131014

10141015
/**
10151016
* Do the read/write for connected sockets that are ready for IO.
@@ -1023,16 +1024,16 @@ class CConnman
10231024
const std::set<SOCKET>& recv_set,
10241025
const std::set<SOCKET>& send_set,
10251026
const std::set<SOCKET>& error_set)
1026-
EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
1027+
EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc);
10271028

10281029
/**
10291030
* Accept incoming connections, one from each read-ready listening socket.
10301031
* @param[in] recv_set Sockets that are ready for read.
10311032
*/
10321033
void SocketHandlerListening(const std::set<SOCKET>& recv_set);
10331034

1034-
void ThreadSocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex);
1035-
void ThreadDNSAddressSeed();
1035+
void ThreadSocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex, !mutexMsgProc);
1036+
void ThreadDNSAddressSeed() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex, !m_nodes_mutex);
10361037

10371038
uint64_t CalculateKeyedNetGroup(const CAddress& ad) const;
10381039

src/net_processing.cpp

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -440,30 +440,37 @@ class PeerManagerImpl final : public PeerManager
440440
CTxMemPool& pool, bool ignore_incoming_txs);
441441

442442
/** Overridden from CValidationInterface. */
443-
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override;
444-
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override;
445-
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;
446-
void BlockChecked(const CBlock& block, const BlockValidationState& state) override;
443+
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override
444+
EXCLUSIVE_LOCKS_REQUIRED(!m_recent_confirmed_transactions_mutex);
445+
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override
446+
EXCLUSIVE_LOCKS_REQUIRED(!m_recent_confirmed_transactions_mutex);
447+
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override
448+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
449+
void BlockChecked(const CBlock& block, const BlockValidationState& state) override
450+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
447451
void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) override;
448452

449453
/** Implement NetEventsInterface */
450-
void InitializeNode(CNode* pnode) override;
451-
void FinalizeNode(const CNode& node) override;
452-
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override;
453-
bool SendMessages(CNode* pto) override EXCLUSIVE_LOCKS_REQUIRED(pto->cs_sendProcessing);
454+
void InitializeNode(CNode* pnode) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
455+
void FinalizeNode(const CNode& node) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
456+
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override
457+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex);
458+
bool SendMessages(CNode* pto) override EXCLUSIVE_LOCKS_REQUIRED(pto->cs_sendProcessing)
459+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex);
454460

455461
/** Implement PeerManager */
456462
void StartScheduledTasks(CScheduler& scheduler) override;
457463
void CheckForStaleTipAndEvictPeers() override;
458464
std::optional<std::string> FetchBlock(NodeId peer_id, const CBlockIndex& block_index) override;
459-
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const override;
465+
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
460466
bool IgnoresIncomingTxs() override { return m_ignore_incoming_txs; }
461-
void SendPings() override;
462-
void RelayTransaction(const uint256& txid, const uint256& wtxid) override;
467+
void SendPings() override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
468+
void RelayTransaction(const uint256& txid, const uint256& wtxid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
463469
void SetBestHeight(int height) override { m_best_height = height; };
464-
void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message) override;
470+
void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
465471
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
466-
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) override;
472+
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) override
473+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex);
467474
void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) override;
468475

469476
private:
@@ -474,15 +481,15 @@ class PeerManagerImpl final : public PeerManager
474481
void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
475482

476483
/** Retrieve unbroadcast transactions from the mempool and reattempt sending to peers */
477-
void ReattemptInitialBroadcast(CScheduler& scheduler);
484+
void ReattemptInitialBroadcast(CScheduler& scheduler) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
478485

479486
/** Get a shared pointer to the Peer object.
480487
* May return an empty shared_ptr if the Peer object can't be found. */
481-
PeerRef GetPeerRef(NodeId id) const;
488+
PeerRef GetPeerRef(NodeId id) const EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
482489

483490
/** Get a shared pointer to the Peer object and remove it from m_peer_map.
484491
* May return an empty shared_ptr if the Peer object can't be found. */
485-
PeerRef RemovePeer(NodeId id);
492+
PeerRef RemovePeer(NodeId id) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
486493

487494
/**
488495
* Potentially mark a node discouraged based on the contents of a BlockValidationState object
@@ -495,14 +502,16 @@ class PeerManagerImpl final : public PeerManager
495502
* @return Returns true if the peer was punished (probably disconnected)
496503
*/
497504
bool MaybePunishNodeForBlock(NodeId nodeid, const BlockValidationState& state,
498-
bool via_compact_block, const std::string& message = "");
505+
bool via_compact_block, const std::string& message = "")
506+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
499507

500508
/**
501509
* Potentially disconnect and discourage a node based on the contents of a TxValidationState object
502510
*
503511
* @return Returns true if the peer was punished (probably disconnected)
504512
*/
505-
bool MaybePunishNodeForTx(NodeId nodeid, const TxValidationState& state, const std::string& message = "");
513+
bool MaybePunishNodeForTx(NodeId nodeid, const TxValidationState& state, const std::string& message = "")
514+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
506515

507516
/** Maybe disconnect a peer and discourage future connections from its address.
508517
*
@@ -512,13 +521,16 @@ class PeerManagerImpl final : public PeerManager
512521
*/
513522
bool MaybeDiscourageAndDisconnect(CNode& pnode, Peer& peer);
514523

515-
void ProcessOrphanTx(std::set<uint256>& orphan_work_set) EXCLUSIVE_LOCKS_REQUIRED(cs_main, g_cs_orphans);
524+
void ProcessOrphanTx(std::set<uint256>& orphan_work_set) EXCLUSIVE_LOCKS_REQUIRED(cs_main, g_cs_orphans)
525+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
516526
/** Process a single headers message from a peer. */
517527
void ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
518528
const std::vector<CBlockHeader>& headers,
519-
bool via_compact_block);
529+
bool via_compact_block)
530+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
520531

521-
void SendBlockTransactions(CNode& pfrom, const CBlock& block, const BlockTransactionsRequest& req);
532+
void SendBlockTransactions(CNode& pfrom, const CBlock& block, const BlockTransactionsRequest& req)
533+
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
522534

523535
/** Register with TxRequestTracker that an INV has been received from a
524536
* peer. The announcement parameters are decided in PeerManager and then
@@ -545,7 +557,7 @@ class PeerManagerImpl final : public PeerManager
545557
* @param[in] fReachable Whether the address' network is reachable. We relay unreachable
546558
* addresses less.
547559
*/
548-
void RelayAddress(NodeId originator, const CAddress& addr, bool fReachable);
560+
void RelayAddress(NodeId originator, const CAddress& addr, bool fReachable) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
549561

550562
/** Send `feefilter` message. */
551563
void MaybeSendFeefilter(CNode& node, Peer& peer, std::chrono::microseconds current_time);
@@ -615,7 +627,8 @@ class PeerManagerImpl final : public PeerManager
615627
/** Number of preferable block download peers. */
616628
int m_num_preferred_download_peers GUARDED_BY(cs_main){0};
617629

618-
bool AlreadyHaveTx(const GenTxid& gtxid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
630+
bool AlreadyHaveTx(const GenTxid& gtxid)
631+
EXCLUSIVE_LOCKS_REQUIRED(cs_main, !m_recent_confirmed_transactions_mutex);
619632

620633
/**
621634
* Filter for transactions that were recently rejected by the mempool.

src/qt/clientmodel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class ClientModel : public QObject
6161
//! Return number of connections, default is in- and outbound (total)
6262
int getNumConnections(unsigned int flags = CONNECTIONS_ALL) const;
6363
int getNumBlocks() const;
64-
uint256 getBestBlockHash();
64+
uint256 getBestBlockHash() EXCLUSIVE_LOCKS_REQUIRED(!m_cached_tip_mutex);
6565
int getHeaderTipHeight() const;
6666
int64_t getHeaderTipTime() const;
6767

src/random.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ class RNGState {
374374
{
375375
}
376376

377-
void AddEvent(uint32_t event_info) noexcept
377+
void AddEvent(uint32_t event_info) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_events_mutex)
378378
{
379379
LOCK(m_events_mutex);
380380

@@ -388,7 +388,7 @@ class RNGState {
388388
/**
389389
* Feed (the hash of) all events added through AddEvent() to hasher.
390390
*/
391-
void SeedEvents(CSHA512& hasher) noexcept
391+
void SeedEvents(CSHA512& hasher) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_events_mutex)
392392
{
393393
// We use only SHA256 for the events hashing to get the ASM speedups we have for SHA256,
394394
// since we want it to be fast as network peers may be able to trigger it repeatedly.
@@ -407,7 +407,7 @@ class RNGState {
407407
*
408408
* If this function has never been called with strong_seed = true, false is returned.
409409
*/
410-
bool MixExtract(unsigned char* out, size_t num, CSHA512&& hasher, bool strong_seed) noexcept
410+
bool MixExtract(unsigned char* out, size_t num, CSHA512&& hasher, bool strong_seed) noexcept EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
411411
{
412412
assert(num <= 32);
413413
unsigned char buf[64];

0 commit comments

Comments
 (0)