mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge pull request #3618 from PastaPastaPasta/backports-0.17-pr16
Backports 0.17 pr16
This commit is contained in:
commit
6e592cc691
@ -186,3 +186,14 @@ It will do the following automatically:
|
||||
- add missing translations to the build system (TODO)
|
||||
|
||||
See doc/translation-process.md for more information.
|
||||
|
||||
circular-dependencies.py
|
||||
========================
|
||||
|
||||
Run this script from the root of the source tree (`src/`) to find circular dependencies in the source code.
|
||||
This looks only at which files include other files, treating the `.cpp` and `.h` file as one unit.
|
||||
|
||||
Example usage:
|
||||
|
||||
cd .../src
|
||||
../contrib/devtools/circular-dependencies.py {*,*/*,*/*/*}.{h,cpp}
|
||||
|
79
contrib/devtools/circular-dependencies.py
Executable file
79
contrib/devtools/circular-dependencies.py
Executable file
@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
|
||||
MAPPING = {
|
||||
'core_read.cpp': 'core_io.cpp',
|
||||
'core_write.cpp': 'core_io.cpp',
|
||||
}
|
||||
|
||||
def module_name(path):
|
||||
if path in MAPPING:
|
||||
path = MAPPING[path]
|
||||
if path.endswith(".h"):
|
||||
return path[:-2]
|
||||
if path.endswith(".c"):
|
||||
return path[:-2]
|
||||
if path.endswith(".cpp"):
|
||||
return path[:-4]
|
||||
return None
|
||||
|
||||
files = dict()
|
||||
deps = dict()
|
||||
|
||||
RE = re.compile("^#include <(.*)>")
|
||||
|
||||
# Iterate over files, and create list of modules
|
||||
for arg in sys.argv[1:]:
|
||||
module = module_name(arg)
|
||||
if module is None:
|
||||
print("Ignoring file %s (does not constitute module)\n" % arg)
|
||||
else:
|
||||
files[arg] = module
|
||||
deps[module] = set()
|
||||
|
||||
# Iterate again, and build list of direct dependencies for each module
|
||||
# TODO: implement support for multiple include directories
|
||||
for arg in sorted(files.keys()):
|
||||
module = files[arg]
|
||||
with open(arg, 'r') as f:
|
||||
for line in f:
|
||||
match = RE.match(line)
|
||||
if match:
|
||||
include = match.group(1)
|
||||
included_module = module_name(include)
|
||||
if included_module is not None and included_module in deps and included_module != module:
|
||||
deps[module].add(included_module)
|
||||
|
||||
# Loop to find the shortest (remaining) circular dependency
|
||||
have_cycle = False
|
||||
while True:
|
||||
shortest_cycle = None
|
||||
for module in sorted(deps.keys()):
|
||||
# Build the transitive closure of dependencies of module
|
||||
closure = dict()
|
||||
for dep in deps[module]:
|
||||
closure[dep] = []
|
||||
while True:
|
||||
old_size = len(closure)
|
||||
old_closure_keys = sorted(closure.keys())
|
||||
for src in old_closure_keys:
|
||||
for dep in deps[src]:
|
||||
if dep not in closure:
|
||||
closure[dep] = closure[src] + [src]
|
||||
if len(closure) == old_size:
|
||||
break
|
||||
# If module is in its own transitive closure, it's a circular dependency; check if it is the shortest
|
||||
if module in closure and (shortest_cycle is None or len(closure[module]) + 1 < len(shortest_cycle)):
|
||||
shortest_cycle = [module] + closure[module]
|
||||
if shortest_cycle is None:
|
||||
break
|
||||
# We have the shortest circular dependency; report it
|
||||
module = shortest_cycle[0]
|
||||
print("Circular dependency: %s" % (" -> ".join(shortest_cycle + [module])))
|
||||
# And then break the dependency to avoid repeating in other cycles
|
||||
deps[shortest_cycle[-1]] = deps[shortest_cycle[-1]] - set([module])
|
||||
have_cycle = True
|
||||
|
||||
sys.exit(1 if have_cycle else 0)
|
29
contrib/devtools/lint-include-guards.sh
Executable file
29
contrib/devtools/lint-include-guards.sh
Executable file
@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
#
|
||||
# Check include guards.
|
||||
|
||||
HEADER_ID_PREFIX="BITCOIN_"
|
||||
HEADER_ID_SUFFIX="_H"
|
||||
|
||||
REGEXP_EXCLUDE_FILES_WITH_PREFIX="src/(crypto/ctaes/|leveldb/|secp256k1/|tinyformat.h|univalue/|ctpl.h|bls/|crypto/sph)"
|
||||
|
||||
EXIT_CODE=0
|
||||
for HEADER_FILE in $(git ls-files -- "*.h" | grep -vE "^${REGEXP_EXCLUDE_FILES_WITH_PREFIX}")
|
||||
do
|
||||
HEADER_ID_BASE=$(cut -f2- -d/ <<< "${HEADER_FILE}" | sed "s/\.h$//g" | tr / _ | tr "[:lower:]" "[:upper:]" | tr - _)
|
||||
HEADER_ID="${HEADER_ID_PREFIX}${HEADER_ID_BASE}${HEADER_ID_SUFFIX}"
|
||||
if [[ $(grep -cE "^#(ifndef|define) ${HEADER_ID}" "${HEADER_FILE}") != 2 ]]; then
|
||||
echo "${HEADER_FILE} seems to be missing the expected include guard:"
|
||||
echo " #ifndef ${HEADER_ID}"
|
||||
echo " #define ${HEADER_ID}"
|
||||
echo " ..."
|
||||
echo " #endif // ${HEADER_ID}"
|
||||
echo
|
||||
EXIT_CODE=1
|
||||
fi
|
||||
done
|
||||
exit ${EXIT_CODE}
|
@ -564,6 +564,16 @@ namespace {
|
||||
source file into account. This allows quoted includes to stand out more when
|
||||
the location of the source file actually is relevant.
|
||||
|
||||
- Use include guards to avoid the problem of double inclusion. The header file
|
||||
`foo/bar.h` should use the include guard identifier `BITCOIN_FOO_BAR_H`, e.g.
|
||||
|
||||
```c++
|
||||
#ifndef BITCOIN_FOO_BAR_H
|
||||
#define BITCOIN_FOO_BAR_H
|
||||
...
|
||||
#endif // BITCOIN_FOO_BAR_H
|
||||
```
|
||||
|
||||
GUI
|
||||
-----
|
||||
|
||||
|
@ -187,6 +187,7 @@ BITCOIN_CORE_H = \
|
||||
llmq/quorums_signing.h \
|
||||
llmq/quorums_signing_shares.h \
|
||||
llmq/quorums_utils.h \
|
||||
logging.h \
|
||||
masternode/activemasternode.h \
|
||||
masternode/masternode-meta.h \
|
||||
masternode/masternode-payments.h \
|
||||
@ -546,6 +547,7 @@ libdash_util_a_SOURCES = \
|
||||
compat/glibcxx_sanity.cpp \
|
||||
compat/strnlen.cpp \
|
||||
fs.cpp \
|
||||
logging.cpp \
|
||||
random.cpp \
|
||||
rpc/protocol.cpp \
|
||||
stacktraces.cpp \
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_BATCHEDLOGGER_H
|
||||
#define DASH_BATCHEDLOGGER_H
|
||||
#ifndef BITCOIN_BATCHEDLOGGER_H
|
||||
#define BITCOIN_BATCHEDLOGGER_H
|
||||
|
||||
#include <tinyformat.h>
|
||||
|
||||
@ -29,4 +29,4 @@ public:
|
||||
void Flush();
|
||||
};
|
||||
|
||||
#endif//DASH_BATCHEDLOGGER_H
|
||||
#endif//BITCOIN_BATCHEDLOGGER_H
|
||||
|
@ -3,8 +3,8 @@
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
/** Functions for measurement of CPU cycles */
|
||||
#ifndef H_PERF
|
||||
#define H_PERF
|
||||
#ifndef BITCOIN_BENCH_PERF_H
|
||||
#define BITCOIN_BENCH_PERF_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@ -34,4 +34,4 @@ uint64_t perf_cpucycles(void);
|
||||
void perf_init(void);
|
||||
void perf_fini(void);
|
||||
|
||||
#endif // H_PERF
|
||||
#endif // BITCOIN_BENCH_PERF_H
|
||||
|
@ -21,8 +21,8 @@
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef DASH_BIP39_H
|
||||
#define DASH_BIP39_H
|
||||
#ifndef BITCOIN_BIP39_H
|
||||
#define BITCOIN_BIP39_H
|
||||
|
||||
#include <support/allocators/secure.h>
|
||||
|
||||
@ -36,4 +36,4 @@ public:
|
||||
static void ToSeed(SecureString mnemonic, SecureString passphrase, SecureVector& seedRet);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_BIP39_H
|
||||
|
@ -21,6 +21,9 @@
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef BITCOIN_BIP39_ENGLISH_H
|
||||
#define BITCOIN_BIP39_ENGLISH_H
|
||||
|
||||
const char * const wordlist[] = {
|
||||
"abandon",
|
||||
"ability",
|
||||
@ -2072,3 +2075,5 @@ const char * const wordlist[] = {
|
||||
"zoo",
|
||||
0,
|
||||
};
|
||||
|
||||
#endif // BITCOIN_BIP39_ENGLISH_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_BLOCK_ENCODINGS_H
|
||||
#define BITCOIN_BLOCK_ENCODINGS_H
|
||||
#ifndef BITCOIN_BLOCKENCODINGS_H
|
||||
#define BITCOIN_BLOCKENCODINGS_H
|
||||
|
||||
#include <primitives/block.h>
|
||||
|
||||
@ -209,4 +209,4 @@ public:
|
||||
ReadStatus FillBlock(CBlock& block, const std::vector<CTransactionRef>& vtx_missing);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_BLOCKENCODINGS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef CACHEMAP_H_
|
||||
#define CACHEMAP_H_
|
||||
#ifndef BITCOIN_CACHEMAP_H
|
||||
#define BITCOIN_CACHEMAP_H
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
@ -186,4 +186,4 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* CACHEMAP_H_ */
|
||||
#endif // BITCOIN_CACHEMAP_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef CACHEMULTIMAP_H_
|
||||
#define CACHEMULTIMAP_H_
|
||||
#ifndef BITCOIN_CACHEMULTIMAP_H
|
||||
#define BITCOIN_CACHEMULTIMAP_H
|
||||
|
||||
#include <cstddef>
|
||||
#include <map>
|
||||
@ -245,4 +245,4 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* CACHEMULTIMAP_H_ */
|
||||
#endif // BITCOIN_CACHEMULTIMAP_H
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef DASH_CHAINPARAMSSEEDS_H
|
||||
#define DASH_CHAINPARAMSSEEDS_H
|
||||
#ifndef BITCOIN_CHAINPARAMSSEEDS_H
|
||||
#define BITCOIN_CHAINPARAMSSEEDS_H
|
||||
/**
|
||||
* List of fixed seed nodes for the dash network
|
||||
* AUTOGENERATED by contrib/seeds/generate-seeds.py
|
||||
@ -283,4 +283,4 @@ static SeedSpec6 pnSeed6_test[] = {
|
||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xd5,0x25,0x01}, 19999},
|
||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xd5,0x25,0x02}, 19999}
|
||||
};
|
||||
#endif // DASH_CHAINPARAMSSEEDS_H
|
||||
#endif // BITCOIN_CHAINPARAMSSEEDS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_MERKLE
|
||||
#define BITCOIN_MERKLE
|
||||
#ifndef BITCOIN_CONSENSUS_MERKLE_H
|
||||
#define BITCOIN_CONSENSUS_MERKLE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
@ -20,4 +20,4 @@ uint256 ComputeMerkleRoot(std::vector<uint256> hashes, bool* mutated = nullptr);
|
||||
*/
|
||||
uint256 BlockMerkleRoot(const CBlock& block, bool* mutated = nullptr);
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_CONSENSUS_MERKLE_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_CBTX_H
|
||||
#define DASH_CBTX_H
|
||||
#ifndef BITCOIN_EVO_CBTX_H
|
||||
#define BITCOIN_EVO_CBTX_H
|
||||
|
||||
#include <consensus/validation.h>
|
||||
#include <primitives/transaction.h>
|
||||
@ -60,4 +60,4 @@ bool CheckCbTxMerkleRoots(const CBlock& block, const CBlockIndex* pindex, CValid
|
||||
bool CalcCbTxMerkleRootMNList(const CBlock& block, const CBlockIndex* pindexPrev, uint256& merkleRootRet, CValidationState& state);
|
||||
bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPrev, uint256& merkleRootRet, CValidationState& state);
|
||||
|
||||
#endif //DASH_CBTX_H
|
||||
#endif // BITCOIN_EVO_CBTX_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_DETERMINISTICMNS_H
|
||||
#define DASH_DETERMINISTICMNS_H
|
||||
#ifndef BITCOIN_EVO_DETERMINISTICMNS_H
|
||||
#define BITCOIN_EVO_DETERMINISTICMNS_H
|
||||
|
||||
#include <arith_uint256.h>
|
||||
#include <bls/bls.h>
|
||||
@ -682,4 +682,4 @@ private:
|
||||
|
||||
extern std::unique_ptr<CDeterministicMNManager> deterministicMNManager;
|
||||
|
||||
#endif //DASH_DETERMINISTICMNS_H
|
||||
#endif // BITCOIN_EVO_DETERMINISTICMNS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_EVODB_H
|
||||
#define DASH_EVODB_H
|
||||
#ifndef BITCOIN_EVO_EVODB_H
|
||||
#define BITCOIN_EVO_EVODB_H
|
||||
|
||||
#include <dbwrapper.h>
|
||||
#include <sync.h>
|
||||
@ -110,4 +110,4 @@ private:
|
||||
|
||||
extern std::unique_ptr<CEvoDB> evoDb;
|
||||
|
||||
#endif //DASH_EVODB_H
|
||||
#endif // BITCOIN_EVO_EVODB_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_MNAUTH_H
|
||||
#define DASH_MNAUTH_H
|
||||
#ifndef BITCOIN_EVO_MNAUTH_H
|
||||
#define BITCOIN_EVO_MNAUTH_H
|
||||
|
||||
#include <bls/bls.h>
|
||||
#include <serialize.h>
|
||||
@ -55,4 +55,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#endif //DASH_MNAUTH_H
|
||||
#endif // BITCOIN_EVO_MNAUTH_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_PROVIDERTX_H
|
||||
#define DASH_PROVIDERTX_H
|
||||
#ifndef BITCOIN_EVO_PROVIDERTX_H
|
||||
#define BITCOIN_EVO_PROVIDERTX_H
|
||||
|
||||
#include <bls/bls.h>
|
||||
#include <consensus/validation.h>
|
||||
@ -240,4 +240,4 @@ bool CheckProUpServTx(const CTransaction& tx, const CBlockIndex* pindexPrev, CVa
|
||||
bool CheckProUpRegTx(const CTransaction& tx, const CBlockIndex* pindexPrev, CValidationState& state);
|
||||
bool CheckProUpRevTx(const CTransaction& tx, const CBlockIndex* pindexPrev, CValidationState& state);
|
||||
|
||||
#endif //DASH_PROVIDERTX_H
|
||||
#endif // BITCOIN_EVO_PROVIDERTX_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_SIMPLIFIEDMNS_H
|
||||
#define DASH_SIMPLIFIEDMNS_H
|
||||
#ifndef BITCOIN_EVO_SIMPLIFIEDMNS_H
|
||||
#define BITCOIN_EVO_SIMPLIFIEDMNS_H
|
||||
|
||||
#include <bls/bls.h>
|
||||
#include <merkleblock.h>
|
||||
@ -147,4 +147,4 @@ public:
|
||||
|
||||
bool BuildSimplifiedMNListDiff(const uint256& baseBlockHash, const uint256& blockHash, CSimplifiedMNListDiff& mnListDiffRet, std::string& errorRet);
|
||||
|
||||
#endif //DASH_SIMPLIFIEDMNS_H
|
||||
#endif // BITCOIN_EVO_SIMPLIFIEDMNS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_SPECIALTX_H
|
||||
#define DASH_SPECIALTX_H
|
||||
#ifndef BITCOIN_EVO_SPECIALTX_H
|
||||
#define BITCOIN_EVO_SPECIALTX_H
|
||||
|
||||
#include <primitives/transaction.h>
|
||||
#include <streams.h>
|
||||
@ -49,4 +49,4 @@ void SetTxPayload(CMutableTransaction& tx, const T& payload)
|
||||
|
||||
uint256 CalcTxInputsHash(const CTransaction& tx);
|
||||
|
||||
#endif //DASH_SPECIALTX_H
|
||||
#endif // BITCOIN_EVO_SPECIALTX_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef FLAT_DATABASE_H
|
||||
#define FLAT_DATABASE_H
|
||||
#ifndef BITCOIN_FLAT_DATABASE_H
|
||||
#define BITCOIN_FLAT_DATABASE_H
|
||||
|
||||
#include <chainparams.h>
|
||||
#include <clientversion.h>
|
||||
@ -225,4 +225,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_FLAT_DATABASE_H
|
||||
|
@ -1,8 +1,8 @@
|
||||
// Copyright (c) 2014-2020 The Dash Core developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef GOVERNANCE_CLASSES_H
|
||||
#define GOVERNANCE_CLASSES_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_CLASSES_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_CLASSES_H
|
||||
|
||||
#include <base58.h>
|
||||
#include <governance/governance.h>
|
||||
@ -173,4 +173,4 @@ public:
|
||||
bool IsExpired() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_CLASSES_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_EXCEPTIONS_H
|
||||
#define GOVERNANCE_EXCEPTIONS_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_EXCEPTIONS_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_EXCEPTIONS_H
|
||||
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
@ -97,4 +97,4 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_EXCEPTIONS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_OBJECT_H
|
||||
#define GOVERNANCE_OBJECT_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_OBJECT_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_OBJECT_H
|
||||
|
||||
#include <cachemultimap.h>
|
||||
#include <governance/governance-exceptions.h>
|
||||
@ -356,4 +356,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_OBJECT_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_VALIDATORS_H
|
||||
#define GOVERNANCE_VALIDATORS_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_VALIDATORS_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_VALIDATORS_H
|
||||
|
||||
#include <string>
|
||||
|
||||
@ -44,4 +44,4 @@ private:
|
||||
bool CheckURL(const std::string& strURLIn);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_VALIDATORS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_VOTE_H
|
||||
#define GOVERNANCE_VOTE_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_VOTE_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_VOTE_H
|
||||
|
||||
#include <key.h>
|
||||
#include <primitives/transaction.h>
|
||||
@ -133,4 +133,4 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_VOTE_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_VOTEDB_H
|
||||
#define GOVERNANCE_VOTEDB_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_VOTEDB_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_VOTEDB_H
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
@ -92,4 +92,4 @@ private:
|
||||
void RebuildIndex();
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_VOTEDB_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef GOVERNANCE_H
|
||||
#define GOVERNANCE_H
|
||||
#ifndef BITCOIN_GOVERNANCE_GOVERNANCE_H
|
||||
#define BITCOIN_GOVERNANCE_GOVERNANCE_H
|
||||
|
||||
#include <bloom.h>
|
||||
#include <cachemap.h>
|
||||
@ -432,4 +432,4 @@ private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_GOVERNANCE_GOVERNANCE_H
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Copyright (c) 2014-2019 The Dash Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
#ifndef DASH_HDCHAIN_H
|
||||
#define DASH_HDCHAIN_H
|
||||
#ifndef BITCOIN_HDCHAIN_H
|
||||
#define BITCOIN_HDCHAIN_H
|
||||
|
||||
#include <key.h>
|
||||
#include <sync.h>
|
||||
@ -147,4 +147,4 @@ public:
|
||||
std::string GetKeyPath() const;
|
||||
};
|
||||
|
||||
#endif // DASH_HDCHAIN_H
|
||||
#endif // BITCOIN_HDCHAIN_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef _KEEPASS_H_
|
||||
#define _KEEPASS_H_
|
||||
#ifndef BITCOIN_KEEPASS_H
|
||||
#define BITCOIN_KEEPASS_H
|
||||
|
||||
#include <support/allocators/secure.h>
|
||||
|
||||
@ -130,4 +130,4 @@ public:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_KEEPASS_H
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_H
|
||||
#define DASH_QUORUMS_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_H
|
||||
|
||||
#include <evo/evodb.h>
|
||||
#include <evo/deterministicmns.h>
|
||||
@ -117,4 +117,4 @@ extern CQuorumManager* quorumManager;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_BLOCKPROCESSOR_H
|
||||
#define DASH_QUORUMS_BLOCKPROCESSOR_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_BLOCKPROCESSOR_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_BLOCKPROCESSOR_H
|
||||
|
||||
#include <llmq/quorums_commitment.h>
|
||||
#include <llmq/quorums_utils.h>
|
||||
@ -68,4 +68,4 @@ extern CQuorumBlockProcessor* quorumBlockProcessor;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif//DASH_QUORUMS_BLOCKPROCESSOR_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_BLOCKPROCESSOR_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_CHAINLOCKS_H
|
||||
#define DASH_QUORUMS_CHAINLOCKS_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_CHAINLOCKS_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_CHAINLOCKS_H
|
||||
|
||||
#include <llmq/quorums.h>
|
||||
#include <llmq/quorums_signing.h>
|
||||
@ -125,4 +125,4 @@ extern CChainLocksHandler* chainLocksHandler;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_CHAINLOCKS_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_CHAINLOCKS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_COMMITMENT_H
|
||||
#define DASH_QUORUMS_COMMITMENT_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_COMMITMENT_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_COMMITMENT_H
|
||||
|
||||
#include <llmq/quorums_utils.h>
|
||||
|
||||
@ -143,4 +143,4 @@ bool CheckLLMQCommitment(const CTransaction& tx, const CBlockIndex* pindexPrev,
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_COMMITMENT_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_COMMITMENT_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_DEBUG_H
|
||||
#define DASH_QUORUMS_DEBUG_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_DEBUG_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_DEBUG_H
|
||||
|
||||
#include <consensus/params.h>
|
||||
#include <sync.h>
|
||||
@ -108,4 +108,4 @@ extern CDKGDebugManager* quorumDKGDebugManager;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_DEBUG_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_DEBUG_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_DKGSESSION_H
|
||||
#define DASH_QUORUMS_DKGSESSION_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_DKGSESSION_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_DKGSESSION_H
|
||||
|
||||
#include <consensus/params.h>
|
||||
#include <net.h>
|
||||
@ -345,4 +345,4 @@ void SetSimulatedDKGErrorRate(const std::string& type, double rate);
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_DKGSESSION_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_DKGSESSION_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_DKGSESSIONHANDLER_H
|
||||
#define DASH_QUORUMS_DKGSESSIONHANDLER_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_DKGSESSIONHANDLER_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_DKGSESSIONHANDLER_H
|
||||
|
||||
#include <llmq/quorums_dkgsession.h>
|
||||
|
||||
@ -145,4 +145,4 @@ private:
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_DKGSESSIONHANDLER_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_DKGSESSIONHANDLER_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_DKGSESSIONMGR_H
|
||||
#define DASH_QUORUMS_DKGSESSIONMGR_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_DKGSESSIONMGR_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_DKGSESSIONMGR_H
|
||||
|
||||
#include <llmq/quorums_dkgsessionhandler.h>
|
||||
|
||||
@ -75,4 +75,4 @@ extern CDKGSessionManager* quorumDKGSessionManager;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_DKGSESSIONMGR_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_DKGSESSIONMGR_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_INIT_H
|
||||
#define DASH_QUORUMS_INIT_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_INIT_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_INIT_H
|
||||
|
||||
class CDBWrapper;
|
||||
class CEvoDB;
|
||||
@ -24,4 +24,4 @@ void StopLLMQSystem();
|
||||
void InterruptLLMQSystem();
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_INIT_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_INIT_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_INSTANTSEND_H
|
||||
#define DASH_QUORUMS_INSTANTSEND_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_INSTANTSEND_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_INSTANTSEND_H
|
||||
|
||||
#include <llmq/quorums_signing.h>
|
||||
|
||||
@ -177,4 +177,4 @@ bool IsInstantSendEnabled();
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif//DASH_QUORUMS_INSTANTSEND_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_INSTANTSEND_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_SIGNING_H
|
||||
#define DASH_QUORUMS_SIGNING_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_SIGNING_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_SIGNING_H
|
||||
|
||||
#include <llmq/quorums.h>
|
||||
|
||||
@ -191,4 +191,4 @@ extern CSigningManager* quorumSigningManager;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_SIGNING_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_SIGNING_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_SIGNING_SHARES_H
|
||||
#define DASH_QUORUMS_SIGNING_SHARES_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_SIGNING_SHARES_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_SIGNING_SHARES_H
|
||||
|
||||
#include <bls/bls.h>
|
||||
#include <chainparams.h>
|
||||
@ -460,4 +460,4 @@ extern CSigSharesManager* quorumSigSharesManager;
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif //DASH_QUORUMS_SIGNING_SHARES_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_SIGNING_SHARES_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_QUORUMS_UTILS_H
|
||||
#define DASH_QUORUMS_UTILS_H
|
||||
#ifndef BITCOIN_LLMQ_QUORUMS_UTILS_H
|
||||
#define BITCOIN_LLMQ_QUORUMS_UTILS_H
|
||||
|
||||
#include <consensus/params.h>
|
||||
#include <net.h>
|
||||
@ -83,4 +83,4 @@ public:
|
||||
|
||||
} // namespace llmq
|
||||
|
||||
#endif//DASH_QUORUMS_UTILS_H
|
||||
#endif // BITCOIN_LLMQ_QUORUMS_UTILS_H
|
||||
|
349
src/logging.cpp
Normal file
349
src/logging.cpp
Normal file
@ -0,0 +1,349 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <logging.h>
|
||||
#include <util.h>
|
||||
#include <utilstrencodings.h>
|
||||
|
||||
#include <list>
|
||||
#include <mutex>
|
||||
|
||||
const char * const DEFAULT_DEBUGLOGFILE = "debug.log";
|
||||
|
||||
bool fPrintToConsole = false;
|
||||
bool fPrintToDebugLog = true;
|
||||
|
||||
bool fLogTimestamps = DEFAULT_LOGTIMESTAMPS;
|
||||
bool fLogTimeMicros = DEFAULT_LOGTIMEMICROS;
|
||||
bool fLogThreadNames = DEFAULT_LOGTHREADNAMES;
|
||||
bool fLogIPs = DEFAULT_LOGIPS;
|
||||
std::atomic<bool> fReopenDebugLog(false);
|
||||
|
||||
/** Log categories bitfield. */
|
||||
std::atomic<uint64_t> logCategories(0);
|
||||
/**
|
||||
* LogPrintf() has been broken a couple of times now
|
||||
* by well-meaning people adding mutexes in the most straightforward way.
|
||||
* It breaks because it may be called by global destructors during shutdown.
|
||||
* Since the order of destruction of static/global objects is undefined,
|
||||
* defining a mutex as a global object doesn't work (the mutex gets
|
||||
* destroyed, and then some later destructor calls OutputDebugStringF,
|
||||
* maybe indirectly, and you get a core dump at shutdown trying to lock
|
||||
* the mutex).
|
||||
*/
|
||||
|
||||
static std::once_flag debugPrintInitFlag;
|
||||
|
||||
/**
|
||||
* We use std::call_once() to make sure mutexDebugLog and
|
||||
* vMsgsBeforeOpenLog are initialized in a thread-safe manner.
|
||||
*
|
||||
* NOTE: fileout, mutexDebugLog and sometimes vMsgsBeforeOpenLog
|
||||
* are leaked on exit. This is ugly, but will be cleaned up by
|
||||
* the OS/libc. When the shutdown sequence is fully audited and
|
||||
* tested, explicit destruction of these objects can be implemented.
|
||||
*/
|
||||
static FILE* fileout = nullptr;
|
||||
static std::mutex* mutexDebugLog = nullptr;
|
||||
static std::list<std::string>* vMsgsBeforeOpenLog;
|
||||
|
||||
static int FileWriteStr(const std::string &str, FILE *fp)
|
||||
{
|
||||
return fwrite(str.data(), 1, str.size(), fp);
|
||||
}
|
||||
|
||||
static void DebugPrintInit()
|
||||
{
|
||||
assert(mutexDebugLog == nullptr);
|
||||
mutexDebugLog = new std::mutex();
|
||||
vMsgsBeforeOpenLog = new std::list<std::string>;
|
||||
}
|
||||
|
||||
fs::path GetDebugLogPath()
|
||||
{
|
||||
fs::path logfile(gArgs.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE));
|
||||
return AbsPathForConfigVal(logfile);
|
||||
}
|
||||
|
||||
bool OpenDebugLog()
|
||||
{
|
||||
std::call_once(debugPrintInitFlag, &DebugPrintInit);
|
||||
std::lock_guard<std::mutex> scoped_lock(*mutexDebugLog);
|
||||
|
||||
assert(fileout == nullptr);
|
||||
assert(vMsgsBeforeOpenLog);
|
||||
fs::path pathDebug = GetDebugLogPath();
|
||||
|
||||
fileout = fsbridge::fopen(pathDebug, "a");
|
||||
if (!fileout) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setbuf(fileout, nullptr); // unbuffered
|
||||
// dump buffered messages from before we opened the log
|
||||
while (!vMsgsBeforeOpenLog->empty()) {
|
||||
FileWriteStr(vMsgsBeforeOpenLog->front(), fileout);
|
||||
vMsgsBeforeOpenLog->pop_front();
|
||||
}
|
||||
|
||||
delete vMsgsBeforeOpenLog;
|
||||
vMsgsBeforeOpenLog = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
struct CLogCategoryDesc
|
||||
{
|
||||
uint64_t flag;
|
||||
std::string category;
|
||||
};
|
||||
|
||||
const CLogCategoryDesc LogCategories[] =
|
||||
{
|
||||
{BCLog::NONE, "0"},
|
||||
{BCLog::NONE, "none"},
|
||||
{BCLog::NET, "net"},
|
||||
{BCLog::TOR, "tor"},
|
||||
{BCLog::MEMPOOL, "mempool"},
|
||||
{BCLog::HTTP, "http"},
|
||||
{BCLog::BENCHMARK, "bench"},
|
||||
{BCLog::ZMQ, "zmq"},
|
||||
{BCLog::DB, "db"},
|
||||
{BCLog::RPC, "rpc"},
|
||||
{BCLog::ESTIMATEFEE, "estimatefee"},
|
||||
{BCLog::ADDRMAN, "addrman"},
|
||||
{BCLog::SELECTCOINS, "selectcoins"},
|
||||
{BCLog::REINDEX, "reindex"},
|
||||
{BCLog::CMPCTBLOCK, "cmpctblock"},
|
||||
{BCLog::RANDOM, "rand"},
|
||||
{BCLog::PRUNE, "prune"},
|
||||
{BCLog::PROXY, "proxy"},
|
||||
{BCLog::MEMPOOLREJ, "mempoolrej"},
|
||||
{BCLog::LIBEVENT, "libevent"},
|
||||
{BCLog::COINDB, "coindb"},
|
||||
{BCLog::QT, "qt"},
|
||||
{BCLog::LEVELDB, "leveldb"},
|
||||
{BCLog::ALL, "1"},
|
||||
{BCLog::ALL, "all"},
|
||||
|
||||
//Start Dash
|
||||
{BCLog::CHAINLOCKS, "chainlocks"},
|
||||
{BCLog::GOBJECT, "gobject"},
|
||||
{BCLog::INSTANTSEND, "instantsend"},
|
||||
{BCLog::KEEPASS, "keepass"},
|
||||
{BCLog::LLMQ, "llmq"},
|
||||
{BCLog::LLMQ_DKG, "llmq-dkg"},
|
||||
{BCLog::LLMQ_SIGS, "llmq-sigs"},
|
||||
{BCLog::MNPAYMENTS, "mnpayments"},
|
||||
{BCLog::MNSYNC, "mnsync"},
|
||||
{BCLog::PRIVATESEND, "privatesend"},
|
||||
{BCLog::SPORK, "spork"},
|
||||
{BCLog::NETCONN, "netconn"},
|
||||
//End Dash
|
||||
};
|
||||
|
||||
bool GetLogCategory(uint64_t *f, const std::string *str)
|
||||
{
|
||||
if (f && str) {
|
||||
if (*str == "") {
|
||||
*f = BCLog::ALL;
|
||||
return true;
|
||||
}
|
||||
if (*str == "dash") {
|
||||
*f = BCLog::CHAINLOCKS
|
||||
| BCLog::GOBJECT
|
||||
| BCLog::INSTANTSEND
|
||||
| BCLog::KEEPASS
|
||||
| BCLog::LLMQ
|
||||
| BCLog::LLMQ_DKG
|
||||
| BCLog::LLMQ_SIGS
|
||||
| BCLog::MNPAYMENTS
|
||||
| BCLog::MNSYNC
|
||||
| BCLog::PRIVATESEND
|
||||
| BCLog::SPORK;
|
||||
return true;
|
||||
}
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
if (LogCategories[i].category == *str) {
|
||||
*f = LogCategories[i].flag;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string ListLogCategories()
|
||||
{
|
||||
std::string ret;
|
||||
int outcount = 0;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) {
|
||||
if (outcount != 0) ret += ", ";
|
||||
ret += LogCategories[i].category;
|
||||
outcount++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<CLogCategoryActive> ListActiveLogCategories()
|
||||
{
|
||||
std::vector<CLogCategoryActive> ret;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) {
|
||||
CLogCategoryActive catActive;
|
||||
catActive.category = LogCategories[i].category;
|
||||
catActive.active = LogAcceptCategory(LogCategories[i].flag);
|
||||
ret.push_back(catActive);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string ListActiveLogCategoriesString()
|
||||
{
|
||||
if (logCategories == BCLog::NONE)
|
||||
return "0";
|
||||
if (logCategories == BCLog::ALL)
|
||||
return "1";
|
||||
|
||||
std::string ret;
|
||||
int outcount = 0;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL && LogAcceptCategory(LogCategories[i].flag)) {
|
||||
if (outcount != 0) ret += ", ";
|
||||
ret += LogCategories[i].category;
|
||||
outcount++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* fStartedNewLine is a state variable held by the calling context that will
|
||||
* suppress printing of the timestamp when multiple calls are made that don't
|
||||
* end in a newline. Initialize it to true, and hold it, in the calling context.
|
||||
*/
|
||||
static std::string LogTimestampStr(const std::string &str, std::atomic_bool *fStartedNewLine)
|
||||
{
|
||||
std::string strStamped;
|
||||
|
||||
if (!fLogTimestamps)
|
||||
return str;
|
||||
|
||||
if (*fStartedNewLine) {
|
||||
int64_t nTimeMicros = GetTimeMicros();
|
||||
strStamped = DateTimeStrFormat("%Y-%m-%d %H:%M:%S", nTimeMicros/1000000);
|
||||
if (fLogTimeMicros)
|
||||
strStamped += strprintf(".%06d", nTimeMicros%1000000);
|
||||
int64_t mocktime = GetMockTime();
|
||||
if (mocktime) {
|
||||
strStamped += " (mocktime: " + DateTimeStrFormat("%Y-%m-%d %H:%M:%S", mocktime) + ")";
|
||||
}
|
||||
strStamped += ' ' + str;
|
||||
} else
|
||||
strStamped = str;
|
||||
|
||||
return strStamped;
|
||||
}
|
||||
|
||||
/**
|
||||
* fStartedNewLine is a state variable held by the calling context that will
|
||||
* suppress printing of the thread name when multiple calls are made that don't
|
||||
* end in a newline. Initialize it to true, and hold/manage it, in the calling context.
|
||||
*/
|
||||
static std::string LogThreadNameStr(const std::string &str, std::atomic_bool *fStartedNewLine)
|
||||
{
|
||||
std::string strThreadLogged;
|
||||
|
||||
if (!fLogThreadNames)
|
||||
return str;
|
||||
|
||||
std::string strThreadName = GetThreadName();
|
||||
|
||||
if (*fStartedNewLine)
|
||||
strThreadLogged = strprintf("%16s | %s", strThreadName.c_str(), str.c_str());
|
||||
else
|
||||
strThreadLogged = str;
|
||||
|
||||
return strThreadLogged;
|
||||
}
|
||||
|
||||
int LogPrintStr(const std::string &str)
|
||||
{
|
||||
int ret = 0; // Returns total number of characters written
|
||||
static std::atomic_bool fStartedNewLine(true);
|
||||
|
||||
std::string strThreadLogged = LogThreadNameStr(str, &fStartedNewLine);
|
||||
std::string strTimestamped = LogTimestampStr(strThreadLogged, &fStartedNewLine);
|
||||
|
||||
if (!str.empty() && str[str.size()-1] == '\n')
|
||||
fStartedNewLine = true;
|
||||
else
|
||||
fStartedNewLine = false;
|
||||
|
||||
if (fPrintToConsole)
|
||||
{
|
||||
// print to console
|
||||
ret = fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout);
|
||||
fflush(stdout);
|
||||
}
|
||||
else if (fPrintToDebugLog)
|
||||
{
|
||||
std::call_once(debugPrintInitFlag, &DebugPrintInit);
|
||||
std::lock_guard<std::mutex> scoped_lock(*mutexDebugLog);
|
||||
|
||||
// buffer if we haven't opened the log yet
|
||||
if (fileout == nullptr) {
|
||||
assert(vMsgsBeforeOpenLog);
|
||||
ret = strTimestamped.length();
|
||||
vMsgsBeforeOpenLog->push_back(strTimestamped);
|
||||
}
|
||||
else
|
||||
{
|
||||
// reopen the log file, if requested
|
||||
if (fReopenDebugLog) {
|
||||
fReopenDebugLog = false;
|
||||
fs::path pathDebug = GetDebugLogPath();
|
||||
if (fsbridge::freopen(pathDebug,"a",fileout) != nullptr)
|
||||
setbuf(fileout, nullptr); // unbuffered
|
||||
}
|
||||
|
||||
ret = FileWriteStr(strTimestamped, fileout);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ShrinkDebugFile()
|
||||
{
|
||||
// Amount of debug.log to save at end when shrinking (must fit in memory)
|
||||
constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000;
|
||||
// Scroll debug.log if it's getting too big
|
||||
fs::path pathLog = GetDebugLogPath();
|
||||
FILE* file = fsbridge::fopen(pathLog, "r");
|
||||
// If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE
|
||||
// trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes
|
||||
if (file && fs::file_size(pathLog) > 11 * (RECENT_DEBUG_HISTORY_SIZE / 10))
|
||||
{
|
||||
// Restart the file with some of the end
|
||||
std::vector<char> vch(RECENT_DEBUG_HISTORY_SIZE, 0);
|
||||
fseek(file, -((long)vch.size()), SEEK_END);
|
||||
int nBytes = fread(vch.data(), 1, vch.size(), file);
|
||||
fclose(file);
|
||||
|
||||
file = fsbridge::fopen(pathLog, "w");
|
||||
if (file)
|
||||
{
|
||||
fwrite(vch.data(), 1, nBytes, file);
|
||||
fclose(file);
|
||||
}
|
||||
}
|
||||
else if (file != nullptr)
|
||||
fclose(file);
|
||||
}
|
161
src/logging.h
Normal file
161
src/logging.h
Normal file
@ -0,0 +1,161 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_LOGGING_H
|
||||
#define BITCOIN_LOGGING_H
|
||||
|
||||
#include <fs.h>
|
||||
#include <tinyformat.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
static const bool DEFAULT_LOGTIMEMICROS = false;
|
||||
static const bool DEFAULT_LOGIPS = false;
|
||||
static const bool DEFAULT_LOGTIMESTAMPS = true;
|
||||
static const bool DEFAULT_LOGTHREADNAMES = false;
|
||||
extern const char * const DEFAULT_DEBUGLOGFILE;
|
||||
|
||||
extern bool fPrintToConsole;
|
||||
extern bool fPrintToDebugLog;
|
||||
|
||||
extern bool fLogTimestamps;
|
||||
extern bool fLogTimeMicros;
|
||||
extern bool fLogThreadNames;
|
||||
extern bool fLogIPs;
|
||||
extern std::atomic<bool> fReopenDebugLog;
|
||||
|
||||
extern std::atomic<uint64_t> logCategories;
|
||||
|
||||
struct CLogCategoryActive
|
||||
{
|
||||
std::string category;
|
||||
bool active;
|
||||
};
|
||||
|
||||
namespace BCLog {
|
||||
enum LogFlags : uint64_t {
|
||||
NONE = 0,
|
||||
NET = (1 << 0),
|
||||
TOR = (1 << 1),
|
||||
MEMPOOL = (1 << 2),
|
||||
HTTP = (1 << 3),
|
||||
BENCHMARK = (1 << 4),
|
||||
ZMQ = (1 << 5),
|
||||
DB = (1 << 6),
|
||||
RPC = (1 << 7),
|
||||
ESTIMATEFEE = (1 << 8),
|
||||
ADDRMAN = (1 << 9),
|
||||
SELECTCOINS = (1 << 10),
|
||||
REINDEX = (1 << 11),
|
||||
CMPCTBLOCK = (1 << 12),
|
||||
RANDOM = (1 << 13),
|
||||
PRUNE = (1 << 14),
|
||||
PROXY = (1 << 15),
|
||||
MEMPOOLREJ = (1 << 16),
|
||||
LIBEVENT = (1 << 17),
|
||||
COINDB = (1 << 18),
|
||||
QT = (1 << 19),
|
||||
LEVELDB = (1 << 20),
|
||||
|
||||
//Start Dash
|
||||
CHAINLOCKS = ((uint64_t)1 << 32),
|
||||
GOBJECT = ((uint64_t)1 << 33),
|
||||
INSTANTSEND = ((uint64_t)1 << 34),
|
||||
KEEPASS = ((uint64_t)1 << 35),
|
||||
LLMQ = ((uint64_t)1 << 36),
|
||||
LLMQ_DKG = ((uint64_t)1 << 37),
|
||||
LLMQ_SIGS = ((uint64_t)1 << 38),
|
||||
MNPAYMENTS = ((uint64_t)1 << 39),
|
||||
MNSYNC = ((uint64_t)1 << 40),
|
||||
PRIVATESEND = ((uint64_t)1 << 41),
|
||||
SPORK = ((uint64_t)1 << 42),
|
||||
NETCONN = ((uint64_t)1 << 43),
|
||||
//End Dash
|
||||
|
||||
NET_NETCONN = NET | NETCONN, // use this to have something logged in NET and NETCONN as well
|
||||
|
||||
ALL = ~(uint64_t)0,
|
||||
};
|
||||
}
|
||||
/** Return true if log accepts specified category */
|
||||
static inline bool LogAcceptCategory(uint64_t category)
|
||||
{
|
||||
return (logCategories.load(std::memory_order_relaxed) & category) != 0;
|
||||
}
|
||||
|
||||
/** Returns a string with the log categories. */
|
||||
std::string ListLogCategories();
|
||||
|
||||
/** Returns a string with the list of active log categories */
|
||||
std::string ListActiveLogCategoriesString();
|
||||
|
||||
/** Returns a vector of the active log categories. */
|
||||
std::vector<CLogCategoryActive> ListActiveLogCategories();
|
||||
|
||||
/** Return true if str parses as a log category and set the flags in f */
|
||||
bool GetLogCategory(uint64_t *f, const std::string *str);
|
||||
|
||||
/** Send a string to the log output */
|
||||
int LogPrintStr(const std::string &str);
|
||||
|
||||
/** Formats a string without throwing exceptions. Instead, it'll return an error string instead of formatted string. */
|
||||
template<typename... Args>
|
||||
std::string SafeStringFormat(const std::string& fmt, const Args&... args)
|
||||
{
|
||||
try {
|
||||
return tinyformat::format(fmt, args...);
|
||||
} catch (std::runtime_error& fmterr) {
|
||||
std::string message = tinyformat::format("\n****TINYFORMAT ERROR****\n err=\"%s\"\n fmt=\"%s\"\n", fmterr.what(), fmt);
|
||||
fprintf(stderr, "%s", message.c_str());
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
/** Get format string from VA_ARGS for error reporting */
|
||||
template<typename... Args> std::string FormatStringFromLogArgs(const char *fmt, const Args&... args) { return fmt; }
|
||||
|
||||
static inline void MarkUsed() {}
|
||||
template<typename T, typename... Args> static inline void MarkUsed(const T& t, const Args&... args)
|
||||
{
|
||||
(void)t;
|
||||
MarkUsed(args...);
|
||||
}
|
||||
|
||||
// Be conservative when using LogPrintf/error or other things which
|
||||
// unconditionally log to debug.log! It should not be the case that an inbound
|
||||
// peer can fill up a user's disk with debug.log entries.
|
||||
|
||||
#ifdef USE_COVERAGE
|
||||
#define LogPrintf(...) do { MarkUsed(__VA_ARGS__); } while(0)
|
||||
#define LogPrint(category, ...) do { MarkUsed(__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LogPrintf(...) do { \
|
||||
if (fPrintToConsole || fPrintToDebugLog) { \
|
||||
std::string _log_msg_; /* Unlikely name to avoid shadowing variables */ \
|
||||
try { \
|
||||
_log_msg_ = tfm::format(__VA_ARGS__); \
|
||||
} catch (tinyformat::format_error &e) { \
|
||||
/* Original format string will have newline so don't add one here */ \
|
||||
_log_msg_ = "Error \"" + std::string(e.what()) + "\" while formatting log message: " + FormatStringFromLogArgs(__VA_ARGS__); \
|
||||
} \
|
||||
LogPrintStr(_log_msg_); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define LogPrint(category, ...) do { \
|
||||
if (LogAcceptCategory((category))) { \
|
||||
LogPrintf(__VA_ARGS__); \
|
||||
} \
|
||||
} while(0)
|
||||
#endif // USE_COVERAGE
|
||||
|
||||
fs::path GetDebugLogPath();
|
||||
bool OpenDebugLog();
|
||||
void ShrinkDebugFile();
|
||||
|
||||
#endif // BITCOIN_LOGGING_H
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef ACTIVEMASTERNODE_H
|
||||
#define ACTIVEMASTERNODE_H
|
||||
#ifndef BITCOIN_MASTERNODE_ACTIVEMASTERNODE_H
|
||||
#define BITCOIN_MASTERNODE_ACTIVEMASTERNODE_H
|
||||
|
||||
#include <chainparams.h>
|
||||
#include <key.h>
|
||||
@ -63,4 +63,4 @@ private:
|
||||
bool GetLocalAddress(CService& addrRet);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_MASTERNODE_ACTIVEMASTERNODE_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef MASTERNODE_META_H
|
||||
#define MASTERNODE_META_H
|
||||
#ifndef BITCOIN_MASTERNODE_MASTERNODE_META_H
|
||||
#define BITCOIN_MASTERNODE_MASTERNODE_META_H
|
||||
|
||||
#include <serialize.h>
|
||||
|
||||
@ -158,4 +158,4 @@ public:
|
||||
|
||||
extern CMasternodeMetaMan mmetaman;
|
||||
|
||||
#endif//MASTERNODE_META_H
|
||||
#endif // BITCOIN_MASTERNODE_MASTERNODE_META_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef MASTERNODE_PAYMENTS_H
|
||||
#define MASTERNODE_PAYMENTS_H
|
||||
#ifndef BITCOIN_MASTERNODE_MASTERNODE_PAYMENTS_H
|
||||
#define BITCOIN_MASTERNODE_MASTERNODE_PAYMENTS_H
|
||||
|
||||
#include <util.h>
|
||||
#include <core_io.h>
|
||||
@ -37,4 +37,4 @@ public:
|
||||
bool GetMasternodeTxOuts(int nBlockHeight, CAmount blockReward, std::vector<CTxOut>& voutMasternodePaymentsRet) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_MASTERNODE_MASTERNODE_PAYMENTS_H
|
||||
|
@ -1,8 +1,8 @@
|
||||
// Copyright (c) 2014-2019 The Dash Core developers
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef MASTERNODE_SYNC_H
|
||||
#define MASTERNODE_SYNC_H
|
||||
#ifndef BITCOIN_MASTERNODE_MASTERNODE_SYNC_H
|
||||
#define BITCOIN_MASTERNODE_MASTERNODE_SYNC_H
|
||||
|
||||
#include <chain.h>
|
||||
#include <net.h>
|
||||
@ -71,4 +71,4 @@ public:
|
||||
void DoMaintenance(CConnman &connman);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_MASTERNODE_MASTERNODE_SYNC_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef MASTERNODE_UTILS_H
|
||||
#define MASTERNODE_UTILS_H
|
||||
#ifndef BITCOIN_MASTERNODE_MASTERNODE_UTILS_H
|
||||
#define BITCOIN_MASTERNODE_MASTERNODE_UTILS_H
|
||||
|
||||
#include <evo/deterministicmns.h>
|
||||
|
||||
@ -16,4 +16,4 @@ public:
|
||||
static void DoMaintenance(CConnman &connman);
|
||||
};
|
||||
|
||||
#endif//MASTERNODE_UTILS_H
|
||||
#endif // BITCOIN_MASTERNODE_MASTERNODE_UTILS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef MESSAGESIGNER_H
|
||||
#define MESSAGESIGNER_H
|
||||
#ifndef BITCOIN_MESSAGESIGNER_H
|
||||
#define BITCOIN_MESSAGESIGNER_H
|
||||
|
||||
#include <key.h>
|
||||
|
||||
@ -35,4 +35,4 @@ public:
|
||||
static bool VerifyHash(const uint256& hash, const CKeyID& keyID, const std::vector<unsigned char>& vchSig, std::string& strErrorRet);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_MESSAGESIGNER_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef NETFULFILLEDMAN_H
|
||||
#define NETFULFILLEDMAN_H
|
||||
#ifndef BITCOIN_NETFULFILLEDMAN_H
|
||||
#define BITCOIN_NETFULFILLEDMAN_H
|
||||
|
||||
#include <netaddress.h>
|
||||
#include <serialize.h>
|
||||
@ -50,4 +50,4 @@ public:
|
||||
void DoMaintenance();
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_NETFULFILLEDMAN_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
#ifndef BITCOIN_POLICYESTIMATOR_H
|
||||
#define BITCOIN_POLICYESTIMATOR_H
|
||||
#ifndef BITCOIN_POLICY_FEES_H
|
||||
#define BITCOIN_POLICY_FEES_H
|
||||
|
||||
#include <amount.h>
|
||||
#include <policy/feerate.h>
|
||||
@ -273,4 +273,4 @@ private:
|
||||
unsigned int MaxUsableEstimate() const;
|
||||
};
|
||||
|
||||
#endif /*BITCOIN_POLICYESTIMATOR_H */
|
||||
#endif // BITCOIN_POLICY_FEES_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef PRIVATESENDCLIENT_H
|
||||
#define PRIVATESENDCLIENT_H
|
||||
#ifndef BITCOIN_PRIVATESEND_PRIVATESEND_CLIENT_H
|
||||
#define BITCOIN_PRIVATESEND_PRIVATESEND_CLIENT_H
|
||||
|
||||
#include <privatesend/privatesend-util.h>
|
||||
#include <privatesend/privatesend.h>
|
||||
@ -261,4 +261,4 @@ public:
|
||||
void GetJsonInfo(UniValue& obj) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_PRIVATESEND_PRIVATESEND_CLIENT_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef PRIVATESENDSERVER_H
|
||||
#define PRIVATESENDSERVER_H
|
||||
#ifndef BITCOIN_PRIVATESEND_PRIVATESEND_SERVER_H
|
||||
#define BITCOIN_PRIVATESEND_PRIVATESEND_SERVER_H
|
||||
|
||||
#include <net.h>
|
||||
#include <privatesend/privatesend.h>
|
||||
@ -82,4 +82,4 @@ public:
|
||||
void GetJsonInfo(UniValue& obj) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_PRIVATESEND_PRIVATESEND_SERVER_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef PRIVATESENDUTIL_H
|
||||
#define PRIVATESENDUTIL_H
|
||||
#ifndef BITCOIN_PRIVATESEND_PRIVATESEND_UTIL_H
|
||||
#define BITCOIN_PRIVATESEND_PRIVATESEND_UTIL_H
|
||||
|
||||
#include <wallet/wallet.h>
|
||||
|
||||
@ -34,4 +34,4 @@ public:
|
||||
void KeepAll();
|
||||
void ReturnAll();
|
||||
};
|
||||
#endif //PRIVATESENDUTIL_H
|
||||
#endif // BITCOIN_PRIVATESEND_PRIVATESEND_UTIL_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef PRIVATESEND_H
|
||||
#define PRIVATESEND_H
|
||||
#ifndef BITCOIN_PRIVATESEND_PRIVATESEND_H
|
||||
#define BITCOIN_PRIVATESEND_PRIVATESEND_H
|
||||
|
||||
#include <bls/bls.h>
|
||||
#include <chain.h>
|
||||
@ -475,4 +475,4 @@ public:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_PRIVATESEND_PRIVATESEND_H
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef MASTERNODELIST_H
|
||||
#define MASTERNODELIST_H
|
||||
#ifndef BITCOIN_QT_MASTERNODELIST_H
|
||||
#define BITCOIN_QT_MASTERNODELIST_H
|
||||
|
||||
#include <qt/platformstyle.h>
|
||||
#include <primitives/transaction.h>
|
||||
@ -76,4 +76,4 @@ private Q_SLOTS:
|
||||
void handleMasternodeListChanged();
|
||||
void updateDIP3ListScheduled();
|
||||
};
|
||||
#endif // MASTERNODELIST_H
|
||||
#endif // BITCOIN_QT_MASTERNODELIST_H
|
||||
|
@ -2,6 +2,9 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_QT_TEST_PAYMENTREQUESTDATA_H
|
||||
#define BITCOIN_QT_TEST_PAYMENTREQUESTDATA_H
|
||||
|
||||
//
|
||||
// Data for paymentservertests.cpp
|
||||
//
|
||||
@ -458,3 +461,5 @@ iEBFUrBDJZU+UEezGwr7/zoECjo5ZY3PmtZcM2sILNjyweJF6XVzGqTxUw6pN6sW\
|
||||
XR2T3Gy2LzRvhVA25QgGqpz0/juS2BtmNbsZPkN9gMMwKimgzc+PuCzmEKwPK9cQ\
|
||||
YQ==\
|
||||
";
|
||||
|
||||
#endif // BITCOIN_QT_TEST_PAYMENTREQUESTDATA_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
|
||||
#define BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
|
||||
#ifndef BITCOIN_QT_TEST_RPCNESTEDTESTS_H
|
||||
#define BITCOIN_QT_TEST_RPCNESTEDTESTS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
@ -19,4 +19,4 @@ class RPCNestedTests : public QObject
|
||||
void rpcNestedTests();
|
||||
};
|
||||
|
||||
#endif // BITCOIN_QT_TEST_RPC_NESTED_TESTS_H
|
||||
#endif // BITCOIN_QT_TEST_RPCNESTEDTESTS_H
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef TRAFFICGRAPHDATATESTS_H
|
||||
#define TRAFFICGRAPHDATATESTS_H
|
||||
#ifndef BITCOIN_QT_TEST_TRAFFICGRAPHDATATESTS_H
|
||||
#define BITCOIN_QT_TEST_TRAFFICGRAPHDATATESTS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
@ -20,4 +20,4 @@ private Q_SLOTS:
|
||||
};
|
||||
|
||||
|
||||
#endif // TRAFFICGRAPHDATATESTS_H
|
||||
#endif // BITCOIN_QT_TEST_TRAFFICGRAPHDATATESTS_H
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef TRAFFICGRAPHDATA_H
|
||||
#define TRAFFICGRAPHDATA_H
|
||||
#ifndef BITCOIN_QT_TRAFFICGRAPHDATA_H
|
||||
#define BITCOIN_QT_TRAFFICGRAPHDATA_H
|
||||
|
||||
#include <QHash>
|
||||
#include <QQueue>
|
||||
@ -88,4 +88,4 @@ private:
|
||||
TrafficGraphData& operator=(TrafficGraphData const&);
|
||||
};
|
||||
|
||||
#endif // TRAFFICGRAPHDATA_H
|
||||
#endif // BITCOIN_QT_TRAFFICGRAPHDATA_H
|
||||
|
@ -11,14 +11,15 @@
|
||||
#include <compat.h> // for Windows API
|
||||
#include <wincrypt.h>
|
||||
#endif
|
||||
#include <util.h> // for LogPrint()
|
||||
#include <utilstrencodings.h> // for GetTime()
|
||||
#include <logging.h> // for LogPrint()
|
||||
#include <utiltime.h> // for GetTime()
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
|
@ -3,8 +3,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_RPCCLIENT_H
|
||||
#define BITCOIN_RPCCLIENT_H
|
||||
#ifndef BITCOIN_RPC_CLIENT_H
|
||||
#define BITCOIN_RPC_CLIENT_H
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
@ -19,4 +19,4 @@ UniValue RPCConvertNamedValues(const std::string& strMethod, const std::vector<s
|
||||
*/
|
||||
UniValue ParseNonRFCJSONValue(const std::string& strVal);
|
||||
|
||||
#endif // BITCOIN_RPCCLIENT_H
|
||||
#endif // BITCOIN_RPC_CLIENT_H
|
||||
|
@ -3,8 +3,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_RPCPROTOCOL_H
|
||||
#define BITCOIN_RPCPROTOCOL_H
|
||||
#ifndef BITCOIN_RPC_PROTOCOL_H
|
||||
#define BITCOIN_RPC_PROTOCOL_H
|
||||
|
||||
#include <fs.h>
|
||||
|
||||
@ -104,4 +104,4 @@ void DeleteAuthCookie();
|
||||
/** Parse JSON-RPC batch reply into a vector */
|
||||
std::vector<UniValue> JSONRPCProcessBatchReply(const UniValue &in, size_t num);
|
||||
|
||||
#endif // BITCOIN_RPCPROTOCOL_H
|
||||
#endif // BITCOIN_RPC_PROTOCOL_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_RPCREGISTER_H
|
||||
#define BITCOIN_RPCREGISTER_H
|
||||
#ifndef BITCOIN_RPC_REGISTER_H
|
||||
#define BITCOIN_RPC_REGISTER_H
|
||||
|
||||
/** These are in one header file to avoid creating tons of single-function
|
||||
* headers for everything under src/rpc/ */
|
||||
@ -44,4 +44,4 @@ static inline void RegisterAllCoreRPCCommands(CRPCTable &t)
|
||||
RegisterQuorumsRPCCommands(t);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_RPC_REGISTER_H
|
||||
|
@ -3,8 +3,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_RPCSERVER_H
|
||||
#define BITCOIN_RPCSERVER_H
|
||||
#ifndef BITCOIN_RPC_SERVER_H
|
||||
#define BITCOIN_RPC_SERVER_H
|
||||
|
||||
#include <amount.h>
|
||||
#include <rpc/protocol.h>
|
||||
@ -204,4 +204,4 @@ void InterruptRPC();
|
||||
void StopRPC();
|
||||
std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq);
|
||||
|
||||
#endif // BITCOIN_RPCSERVER_H
|
||||
#endif // BITCOIN_RPC_SERVER_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef SALTEDHASHER_H
|
||||
#define SALTEDHASHER_H
|
||||
#ifndef BITCOIN_SALTEDHASHER_H
|
||||
#define BITCOIN_SALTEDHASHER_H
|
||||
|
||||
#include <hash.h>
|
||||
#include <uint256.h>
|
||||
@ -72,4 +72,4 @@ struct StaticSaltedHasher
|
||||
}
|
||||
};
|
||||
|
||||
#endif//SALTEDHASHER_H
|
||||
#endif // BITCOIN_SALTEDHASHER_H
|
||||
|
@ -3,8 +3,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_BITCOINCONSENSUS_H
|
||||
#define BITCOIN_BITCOINCONSENSUS_H
|
||||
#ifndef BITCOIN_SCRIPT_DASHCONSENSUS_H
|
||||
#define BITCOIN_SCRIPT_DASHCONSENSUS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@ -74,4 +74,4 @@ EXPORT_SYMBOL unsigned int dashconsensus_version();
|
||||
|
||||
#undef EXPORT_SYMBOL
|
||||
|
||||
#endif // BITCOIN_BITCOINCONSENSUS_H
|
||||
#endif // BITCOIN_SCRIPT_DASHCONSENSUS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef SPORK_H
|
||||
#define SPORK_H
|
||||
#ifndef BITCOIN_SPORK_H
|
||||
#define BITCOIN_SPORK_H
|
||||
|
||||
#include <hash.h>
|
||||
#include <net.h>
|
||||
@ -300,4 +300,4 @@ public:
|
||||
std::string ToString() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_SPORK_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT/X11 software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_STACKTRACES_H
|
||||
#define DASH_STACKTRACES_H
|
||||
#ifndef BITCOIN_STACKTRACES_H
|
||||
#define BITCOIN_STACKTRACES_H
|
||||
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
@ -39,4 +39,4 @@ inline std::string GetExceptionWhat(const T& e)
|
||||
void RegisterPrettyTerminateHander();
|
||||
void RegisterPrettySignalHandlers();
|
||||
|
||||
#endif//DASH_STACKTRACES_H
|
||||
#endif//BITCOIN_STACKTRACES_H
|
||||
|
@ -4,13 +4,15 @@
|
||||
|
||||
#include <sync.h>
|
||||
|
||||
#include <memory>
|
||||
#include <set>
|
||||
#include <util.h>
|
||||
#include <logging.h>
|
||||
#include <utilstrencodings.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <set>
|
||||
|
||||
#ifdef DEBUG_LOCKCONTENTION
|
||||
#if !defined(HAVE_THREAD_LOCAL)
|
||||
static_assert(false, "thread_local is not supported");
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef DASH_UNORDERED_LRU_CACHE_H
|
||||
#define DASH_UNORDERED_LRU_CACHE_H
|
||||
#ifndef BITCOIN_UNORDERED_LRU_CACHE_H
|
||||
#define BITCOIN_UNORDERED_LRU_CACHE_H
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
@ -107,4 +107,4 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
#endif // DASH_UNORDERED_LRU_CACHE_H
|
||||
#endif // BITCOIN_UNORDERED_LRU_CACHE_H
|
||||
|
337
src/util.cpp
337
src/util.cpp
@ -103,22 +103,11 @@ int nWalletBackups = 10;
|
||||
|
||||
const char * const BITCOIN_CONF_FILENAME = "dash.conf";
|
||||
const char * const BITCOIN_PID_FILENAME = "dashd.pid";
|
||||
const char * const DEFAULT_DEBUGLOGFILE = "debug.log";
|
||||
|
||||
ArgsManager gArgs;
|
||||
bool fPrintToConsole = false;
|
||||
bool fPrintToDebugLog = true;
|
||||
|
||||
bool fLogTimestamps = DEFAULT_LOGTIMESTAMPS;
|
||||
bool fLogTimeMicros = DEFAULT_LOGTIMEMICROS;
|
||||
bool fLogThreadNames = DEFAULT_LOGTHREADNAMES;
|
||||
bool fLogIPs = DEFAULT_LOGIPS;
|
||||
std::atomic<bool> fReopenDebugLog(false);
|
||||
CTranslationInterface translationInterface;
|
||||
|
||||
/** Log categories bitfield. */
|
||||
std::atomic<uint64_t> logCategories(0);
|
||||
|
||||
/** Init OpenSSL library multithreading support */
|
||||
static std::unique_ptr<CCriticalSection[]> ppmutexOpenSSL;
|
||||
void locking_callback(int mode, int i, const char* file, int line) NO_THREAD_SAFETY_ANALYSIS
|
||||
@ -167,304 +156,6 @@ public:
|
||||
}
|
||||
instance_of_cinit;
|
||||
|
||||
/**
|
||||
* LogPrintf() has been broken a couple of times now
|
||||
* by well-meaning people adding mutexes in the most straightforward way.
|
||||
* It breaks because it may be called by global destructors during shutdown.
|
||||
* Since the order of destruction of static/global objects is undefined,
|
||||
* defining a mutex as a global object doesn't work (the mutex gets
|
||||
* destroyed, and then some later destructor calls OutputDebugStringF,
|
||||
* maybe indirectly, and you get a core dump at shutdown trying to lock
|
||||
* the mutex).
|
||||
*/
|
||||
|
||||
static std::once_flag debugPrintInitFlag;
|
||||
|
||||
/**
|
||||
* We use std::call_once() to make sure mutexDebugLog and
|
||||
* vMsgsBeforeOpenLog are initialized in a thread-safe manner.
|
||||
*
|
||||
* NOTE: fileout, mutexDebugLog and sometimes vMsgsBeforeOpenLog
|
||||
* are leaked on exit. This is ugly, but will be cleaned up by
|
||||
* the OS/libc. When the shutdown sequence is fully audited and
|
||||
* tested, explicit destruction of these objects can be implemented.
|
||||
*/
|
||||
static FILE* fileout = nullptr;
|
||||
static std::mutex* mutexDebugLog = nullptr;
|
||||
static std::list<std::string>* vMsgsBeforeOpenLog;
|
||||
|
||||
static int FileWriteStr(const std::string &str, FILE *fp)
|
||||
{
|
||||
return fwrite(str.data(), 1, str.size(), fp);
|
||||
}
|
||||
|
||||
static void DebugPrintInit()
|
||||
{
|
||||
assert(mutexDebugLog == nullptr);
|
||||
mutexDebugLog = new std::mutex();
|
||||
vMsgsBeforeOpenLog = new std::list<std::string>;
|
||||
}
|
||||
|
||||
fs::path GetDebugLogPath()
|
||||
{
|
||||
fs::path logfile(gArgs.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE));
|
||||
return AbsPathForConfigVal(logfile);
|
||||
}
|
||||
|
||||
bool OpenDebugLog()
|
||||
{
|
||||
std::call_once(debugPrintInitFlag, &DebugPrintInit);
|
||||
std::lock_guard<std::mutex> scoped_lock(*mutexDebugLog);
|
||||
|
||||
assert(fileout == nullptr);
|
||||
assert(vMsgsBeforeOpenLog);
|
||||
fs::path pathDebug = GetDebugLogPath();
|
||||
|
||||
fileout = fsbridge::fopen(pathDebug, "a");
|
||||
if (!fileout) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setbuf(fileout, nullptr); // unbuffered
|
||||
// dump buffered messages from before we opened the log
|
||||
while (!vMsgsBeforeOpenLog->empty()) {
|
||||
FileWriteStr(vMsgsBeforeOpenLog->front(), fileout);
|
||||
vMsgsBeforeOpenLog->pop_front();
|
||||
}
|
||||
|
||||
delete vMsgsBeforeOpenLog;
|
||||
vMsgsBeforeOpenLog = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
struct CLogCategoryDesc
|
||||
{
|
||||
uint64_t flag;
|
||||
std::string category;
|
||||
};
|
||||
|
||||
const CLogCategoryDesc LogCategories[] =
|
||||
{
|
||||
{BCLog::NONE, "0"},
|
||||
{BCLog::NONE, "none"},
|
||||
{BCLog::NET, "net"},
|
||||
{BCLog::TOR, "tor"},
|
||||
{BCLog::MEMPOOL, "mempool"},
|
||||
{BCLog::HTTP, "http"},
|
||||
{BCLog::BENCHMARK, "bench"},
|
||||
{BCLog::ZMQ, "zmq"},
|
||||
{BCLog::DB, "db"},
|
||||
{BCLog::RPC, "rpc"},
|
||||
{BCLog::ESTIMATEFEE, "estimatefee"},
|
||||
{BCLog::ADDRMAN, "addrman"},
|
||||
{BCLog::SELECTCOINS, "selectcoins"},
|
||||
{BCLog::REINDEX, "reindex"},
|
||||
{BCLog::CMPCTBLOCK, "cmpctblock"},
|
||||
{BCLog::RANDOM, "rand"},
|
||||
{BCLog::PRUNE, "prune"},
|
||||
{BCLog::PROXY, "proxy"},
|
||||
{BCLog::MEMPOOLREJ, "mempoolrej"},
|
||||
{BCLog::LIBEVENT, "libevent"},
|
||||
{BCLog::COINDB, "coindb"},
|
||||
{BCLog::QT, "qt"},
|
||||
{BCLog::LEVELDB, "leveldb"},
|
||||
{BCLog::ALL, "1"},
|
||||
{BCLog::ALL, "all"},
|
||||
|
||||
//Start Dash
|
||||
{BCLog::CHAINLOCKS, "chainlocks"},
|
||||
{BCLog::GOBJECT, "gobject"},
|
||||
{BCLog::INSTANTSEND, "instantsend"},
|
||||
{BCLog::KEEPASS, "keepass"},
|
||||
{BCLog::LLMQ, "llmq"},
|
||||
{BCLog::LLMQ_DKG, "llmq-dkg"},
|
||||
{BCLog::LLMQ_SIGS, "llmq-sigs"},
|
||||
{BCLog::MNPAYMENTS, "mnpayments"},
|
||||
{BCLog::MNSYNC, "mnsync"},
|
||||
{BCLog::PRIVATESEND, "privatesend"},
|
||||
{BCLog::SPORK, "spork"},
|
||||
{BCLog::NETCONN, "netconn"},
|
||||
//End Dash
|
||||
|
||||
};
|
||||
|
||||
bool GetLogCategory(uint64_t *f, const std::string *str)
|
||||
{
|
||||
if (f && str) {
|
||||
if (*str == "") {
|
||||
*f = BCLog::ALL;
|
||||
return true;
|
||||
}
|
||||
if (*str == "dash") {
|
||||
*f = BCLog::CHAINLOCKS
|
||||
| BCLog::GOBJECT
|
||||
| BCLog::INSTANTSEND
|
||||
| BCLog::KEEPASS
|
||||
| BCLog::LLMQ
|
||||
| BCLog::LLMQ_DKG
|
||||
| BCLog::LLMQ_SIGS
|
||||
| BCLog::MNPAYMENTS
|
||||
| BCLog::MNSYNC
|
||||
| BCLog::PRIVATESEND
|
||||
| BCLog::SPORK;
|
||||
return true;
|
||||
}
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
if (LogCategories[i].category == *str) {
|
||||
*f = LogCategories[i].flag;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string ListLogCategories()
|
||||
{
|
||||
std::string ret;
|
||||
int outcount = 0;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) {
|
||||
if (outcount != 0) ret += ", ";
|
||||
ret += LogCategories[i].category;
|
||||
outcount++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<CLogCategoryActive> ListActiveLogCategories()
|
||||
{
|
||||
std::vector<CLogCategoryActive> ret;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) {
|
||||
CLogCategoryActive catActive;
|
||||
catActive.category = LogCategories[i].category;
|
||||
catActive.active = LogAcceptCategory(LogCategories[i].flag);
|
||||
ret.push_back(catActive);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string ListActiveLogCategoriesString()
|
||||
{
|
||||
if (logCategories == BCLog::NONE)
|
||||
return "0";
|
||||
if (logCategories == BCLog::ALL)
|
||||
return "1";
|
||||
|
||||
std::string ret;
|
||||
int outcount = 0;
|
||||
for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) {
|
||||
// Omit the special cases.
|
||||
if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL && LogAcceptCategory(LogCategories[i].flag)) {
|
||||
if (outcount != 0) ret += ", ";
|
||||
ret += LogCategories[i].category;
|
||||
outcount++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* fStartedNewLine is a state variable held by the calling context that will
|
||||
* suppress printing of the timestamp when multiple calls are made that don't
|
||||
* end in a newline. Initialize it to true, and hold/manage it, in the calling context.
|
||||
*/
|
||||
static std::string LogTimestampStr(const std::string &str, std::atomic_bool *fStartedNewLine)
|
||||
{
|
||||
std::string strStamped;
|
||||
|
||||
if (!fLogTimestamps)
|
||||
return str;
|
||||
|
||||
if (*fStartedNewLine) {
|
||||
int64_t nTimeMicros = GetTimeMicros();
|
||||
strStamped = DateTimeStrFormat("%Y-%m-%d %H:%M:%S", nTimeMicros/1000000);
|
||||
if (fLogTimeMicros)
|
||||
strStamped += strprintf(".%06d", nTimeMicros%1000000);
|
||||
int64_t mocktime = GetMockTime();
|
||||
if (mocktime) {
|
||||
strStamped += " (mocktime: " + DateTimeStrFormat("%Y-%m-%d %H:%M:%S", mocktime) + ")";
|
||||
}
|
||||
strStamped += ' ' + str;
|
||||
} else
|
||||
strStamped = str;
|
||||
|
||||
return strStamped;
|
||||
}
|
||||
|
||||
/**
|
||||
* fStartedNewLine is a state variable held by the calling context that will
|
||||
* suppress printing of the thread name when multiple calls are made that don't
|
||||
* end in a newline. Initialize it to true, and hold/manage it, in the calling context.
|
||||
*/
|
||||
static std::string LogThreadNameStr(const std::string &str, std::atomic_bool *fStartedNewLine)
|
||||
{
|
||||
std::string strThreadLogged;
|
||||
|
||||
if (!fLogThreadNames)
|
||||
return str;
|
||||
|
||||
std::string strThreadName = GetThreadName();
|
||||
|
||||
if (*fStartedNewLine)
|
||||
strThreadLogged = strprintf("%16s | %s", strThreadName.c_str(), str.c_str());
|
||||
else
|
||||
strThreadLogged = str;
|
||||
|
||||
return strThreadLogged;
|
||||
}
|
||||
|
||||
int LogPrintStr(const std::string &str)
|
||||
{
|
||||
int ret = 0; // Returns total number of characters written
|
||||
static std::atomic_bool fStartedNewLine(true);
|
||||
|
||||
std::string strThreadLogged = LogThreadNameStr(str, &fStartedNewLine);
|
||||
std::string strTimestamped = LogTimestampStr(strThreadLogged, &fStartedNewLine);
|
||||
|
||||
if (!str.empty() && str[str.size()-1] == '\n')
|
||||
fStartedNewLine = true;
|
||||
else
|
||||
fStartedNewLine = false;
|
||||
|
||||
if (fPrintToConsole)
|
||||
{
|
||||
// print to console
|
||||
ret = fwrite(strTimestamped.data(), 1, strTimestamped.size(), stdout);
|
||||
fflush(stdout);
|
||||
}
|
||||
else if (fPrintToDebugLog)
|
||||
{
|
||||
std::call_once(debugPrintInitFlag, &DebugPrintInit);
|
||||
std::lock_guard<std::mutex> scoped_lock(*mutexDebugLog);
|
||||
|
||||
// buffer if we haven't opened the log yet
|
||||
if (fileout == nullptr) {
|
||||
assert(vMsgsBeforeOpenLog);
|
||||
ret = strTimestamped.length();
|
||||
vMsgsBeforeOpenLog->push_back(strTimestamped);
|
||||
}
|
||||
else
|
||||
{
|
||||
// reopen the log file, if requested
|
||||
if (fReopenDebugLog) {
|
||||
fReopenDebugLog = false;
|
||||
fs::path pathDebug = GetDebugLogPath();
|
||||
if (fsbridge::freopen(pathDebug,"a",fileout) != nullptr)
|
||||
setbuf(fileout, nullptr); // unbuffered
|
||||
}
|
||||
|
||||
ret = FileWriteStr(strTimestamped, fileout);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** A map that contains all the currently held directory locks. After
|
||||
* successful locking, these will be held here until the global destructor
|
||||
* cleans them up and thus automatically unlocks them, or ReleaseDirectoryLocks
|
||||
@ -1195,34 +886,6 @@ void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShrinkDebugFile()
|
||||
{
|
||||
// Amount of debug.log to save at end when shrinking (must fit in memory)
|
||||
constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000;
|
||||
// Scroll debug.log if it's getting too big
|
||||
fs::path pathLog = GetDebugLogPath();
|
||||
FILE* file = fsbridge::fopen(pathLog, "r");
|
||||
// If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE
|
||||
// trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes
|
||||
if (file && fs::file_size(pathLog) > 11 * (RECENT_DEBUG_HISTORY_SIZE / 10))
|
||||
{
|
||||
// Restart the file with some of the end
|
||||
std::vector<char> vch(RECENT_DEBUG_HISTORY_SIZE, 0);
|
||||
fseek(file, -((long)vch.size()), SEEK_END);
|
||||
int nBytes = fread(vch.data(), 1, vch.size(), file);
|
||||
fclose(file);
|
||||
|
||||
file = fsbridge::fopen(pathLog, "w");
|
||||
if (file)
|
||||
{
|
||||
fwrite(vch.data(), 1, nBytes, file);
|
||||
fclose(file);
|
||||
}
|
||||
}
|
||||
else if (file != nullptr)
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
fs::path GetSpecialFolderPath(int nFolder, bool fCreate)
|
||||
{
|
||||
|
144
src/util.h
144
src/util.h
@ -6,7 +6,7 @@
|
||||
|
||||
/**
|
||||
* Server/client environment: argument handling, config file parsing,
|
||||
* logging, thread wrappers, startup time
|
||||
* thread wrappers, startup time
|
||||
*/
|
||||
#ifndef BITCOIN_UTIL_H
|
||||
#define BITCOIN_UTIL_H
|
||||
@ -17,6 +17,7 @@
|
||||
|
||||
#include <compat.h>
|
||||
#include <fs.h>
|
||||
#include <logging.h>
|
||||
#include <sync.h>
|
||||
#include <tinyformat.h>
|
||||
#include <utiltime.h>
|
||||
@ -56,12 +57,6 @@ extern int nWalletBackups;
|
||||
// Application startup time (used for uptime calculation)
|
||||
int64_t GetStartupTime();
|
||||
|
||||
static const bool DEFAULT_LOGTIMEMICROS = false;
|
||||
static const bool DEFAULT_LOGIPS = false;
|
||||
static const bool DEFAULT_LOGTIMESTAMPS = true;
|
||||
static const bool DEFAULT_LOGTHREADNAMES = false;
|
||||
extern const char * const DEFAULT_DEBUGLOGFILE;
|
||||
|
||||
/** Signals for translation. */
|
||||
class CTranslationInterface
|
||||
{
|
||||
@ -70,21 +65,11 @@ public:
|
||||
boost::signals2::signal<std::string (const char* psz)> Translate;
|
||||
};
|
||||
|
||||
extern bool fPrintToConsole;
|
||||
extern bool fPrintToDebugLog;
|
||||
|
||||
extern bool fLogTimestamps;
|
||||
extern bool fLogTimeMicros;
|
||||
extern bool fLogThreadNames;
|
||||
extern bool fLogIPs;
|
||||
extern std::atomic<bool> fReopenDebugLog;
|
||||
extern CTranslationInterface translationInterface;
|
||||
|
||||
extern const char * const BITCOIN_CONF_FILENAME;
|
||||
extern const char * const BITCOIN_PID_FILENAME;
|
||||
|
||||
extern std::atomic<uint64_t> logCategories;
|
||||
|
||||
/**
|
||||
* Translation function: Call Translate signal on UI interface, which returns a boost::optional result.
|
||||
* If no translation slot is registered, nothing is returned, and simply return the input.
|
||||
@ -98,128 +83,6 @@ inline std::string _(const char* psz)
|
||||
void SetupEnvironment();
|
||||
bool SetupNetworking();
|
||||
|
||||
struct CLogCategoryActive
|
||||
{
|
||||
std::string category;
|
||||
bool active;
|
||||
};
|
||||
|
||||
namespace BCLog {
|
||||
enum LogFlags : uint64_t {
|
||||
NONE = 0,
|
||||
NET = (1 << 0),
|
||||
TOR = (1 << 1),
|
||||
MEMPOOL = (1 << 2),
|
||||
HTTP = (1 << 3),
|
||||
BENCHMARK = (1 << 4),
|
||||
ZMQ = (1 << 5),
|
||||
DB = (1 << 6),
|
||||
RPC = (1 << 7),
|
||||
ESTIMATEFEE = (1 << 8),
|
||||
ADDRMAN = (1 << 9),
|
||||
SELECTCOINS = (1 << 10),
|
||||
REINDEX = (1 << 11),
|
||||
CMPCTBLOCK = (1 << 12),
|
||||
RANDOM = (1 << 13),
|
||||
PRUNE = (1 << 14),
|
||||
PROXY = (1 << 15),
|
||||
MEMPOOLREJ = (1 << 16),
|
||||
LIBEVENT = (1 << 17),
|
||||
COINDB = (1 << 18),
|
||||
QT = (1 << 19),
|
||||
LEVELDB = (1 << 20),
|
||||
|
||||
//Start Dash
|
||||
CHAINLOCKS = ((uint64_t)1 << 32),
|
||||
GOBJECT = ((uint64_t)1 << 33),
|
||||
INSTANTSEND = ((uint64_t)1 << 34),
|
||||
KEEPASS = ((uint64_t)1 << 35),
|
||||
LLMQ = ((uint64_t)1 << 36),
|
||||
LLMQ_DKG = ((uint64_t)1 << 37),
|
||||
LLMQ_SIGS = ((uint64_t)1 << 38),
|
||||
MNPAYMENTS = ((uint64_t)1 << 39),
|
||||
MNSYNC = ((uint64_t)1 << 40),
|
||||
PRIVATESEND = ((uint64_t)1 << 41),
|
||||
SPORK = ((uint64_t)1 << 42),
|
||||
NETCONN = ((uint64_t)1 << 43),
|
||||
//End Dash
|
||||
|
||||
NET_NETCONN = NET | NETCONN, // use this to have something logged in NET and NETCONN as well
|
||||
|
||||
ALL = ~(uint64_t)0,
|
||||
};
|
||||
}
|
||||
static inline bool LogAcceptCategory(uint64_t category)
|
||||
{
|
||||
return (logCategories.load(std::memory_order_relaxed) & category) != 0;
|
||||
}
|
||||
|
||||
/** Returns a string with the log categories. */
|
||||
std::string ListLogCategories();
|
||||
|
||||
/** Returns a string with the list of active log categories */
|
||||
std::string ListActiveLogCategoriesString();
|
||||
|
||||
/** Returns a vector of the active log categories. */
|
||||
std::vector<CLogCategoryActive> ListActiveLogCategories();
|
||||
|
||||
/** Return true if str parses as a log category and set the flags in f */
|
||||
bool GetLogCategory(uint64_t *f, const std::string *str);
|
||||
|
||||
/** Send a string to the log output */
|
||||
int LogPrintStr(const std::string &str);
|
||||
|
||||
/** Formats a string without throwing exceptions. Instead, it'll return an error string instead of formatted string. */
|
||||
template<typename... Args>
|
||||
std::string SafeStringFormat(const std::string& fmt, const Args&... args)
|
||||
{
|
||||
try {
|
||||
return tinyformat::format(fmt, args...);
|
||||
} catch (std::runtime_error& fmterr) {
|
||||
std::string message = tinyformat::format("\n****TINYFORMAT ERROR****\n err=\"%s\"\n fmt=\"%s\"\n", fmterr.what(), fmt);
|
||||
fprintf(stderr, "%s", message.c_str());
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
/** Get format string from VA_ARGS for error reporting */
|
||||
template<typename... Args> std::string FormatStringFromLogArgs(const char *fmt, const Args&... args) { return fmt; }
|
||||
|
||||
static inline void MarkUsed() {}
|
||||
template<typename T, typename... Args> static inline void MarkUsed(const T& t, const Args&... args)
|
||||
{
|
||||
(void)t;
|
||||
MarkUsed(args...);
|
||||
}
|
||||
|
||||
// Be conservative when using LogPrintf/error or other things which
|
||||
// unconditionally log to debug.log! It should not be the case that an inbound
|
||||
// peer can fill up a user's disk with debug.log entries.
|
||||
|
||||
#ifdef USE_COVERAGE
|
||||
#define LogPrintf(...) do { MarkUsed(__VA_ARGS__); } while(0)
|
||||
#define LogPrint(category, ...) do { MarkUsed(__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LogPrintf(...) do { \
|
||||
if (fPrintToConsole || fPrintToDebugLog) { \
|
||||
std::string _log_msg_; /* Unlikely name to avoid shadowing variables */ \
|
||||
try { \
|
||||
_log_msg_ = tfm::format(__VA_ARGS__); \
|
||||
} catch (tinyformat::format_error &e) { \
|
||||
/* Original format string will have newline so don't add one here */ \
|
||||
_log_msg_ = "Error \"" + std::string(e.what()) + "\" while formatting log message: " + FormatStringFromLogArgs(__VA_ARGS__); \
|
||||
} \
|
||||
LogPrintStr(_log_msg_); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define LogPrint(category, ...) do { \
|
||||
if (LogAcceptCategory((category))) { \
|
||||
LogPrintf(__VA_ARGS__); \
|
||||
} \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
template<typename... Args>
|
||||
bool error(const char* fmt, const Args&... args)
|
||||
{
|
||||
@ -253,9 +116,6 @@ void CreatePidFile(const fs::path &path, pid_t pid);
|
||||
#ifdef WIN32
|
||||
fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
|
||||
#endif
|
||||
fs::path GetDebugLogPath();
|
||||
bool OpenDebugLog();
|
||||
void ShrinkDebugFile();
|
||||
void runCommand(const std::string& strCommand);
|
||||
|
||||
/**
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_CONSENSUS_VERSIONBITS
|
||||
#define BITCOIN_CONSENSUS_VERSIONBITS
|
||||
#ifndef BITCOIN_VERSIONBITS_H
|
||||
#define BITCOIN_VERSIONBITS_H
|
||||
|
||||
#include <chain.h>
|
||||
#include <map>
|
||||
@ -79,4 +79,4 @@ BIP9Stats VersionBitsStatistics(const CBlockIndex* pindexPrev, const Consensus::
|
||||
int VersionBitsStateSinceHeight(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache);
|
||||
uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentPos pos);
|
||||
|
||||
#endif
|
||||
#endif // BITCOIN_VERSIONBITS_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_WALLET_TEST_FIXTURE_H
|
||||
#define BITCOIN_WALLET_TEST_FIXTURE_H
|
||||
#ifndef BITCOIN_WALLET_TEST_WALLET_TEST_FIXTURE_H
|
||||
#define BITCOIN_WALLET_TEST_WALLET_TEST_FIXTURE_H
|
||||
|
||||
#include <test/test_dash.h>
|
||||
|
||||
@ -20,5 +20,4 @@ struct WalletTestingSetup: public TestingSetup {
|
||||
CWallet m_wallet;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif // BITCOIN_WALLET_TEST_WALLET_TEST_FIXTURE_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_WALLET_UTIL_H
|
||||
#define BITCOIN_WALLET_UTIL_H
|
||||
#ifndef BITCOIN_WALLET_WALLETUTIL_H
|
||||
#define BITCOIN_WALLET_WALLETUTIL_H
|
||||
|
||||
#include <chainparamsbase.h>
|
||||
#include <util.h>
|
||||
@ -11,4 +11,4 @@
|
||||
//! Get the path of the wallet directory.
|
||||
fs::path GetWalletDir();
|
||||
|
||||
#endif // BITCOIN_WALLET_UTIL_H
|
||||
#endif // BITCOIN_WALLET_WALLETUTIL_H
|
||||
|
@ -2,8 +2,8 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef WALLETINITINTERFACE_H
|
||||
#define WALLETINITINTERFACE_H
|
||||
#ifndef BITCOIN_WALLETINITINTERFACE_H
|
||||
#define BITCOIN_WALLETINITINTERFACE_H
|
||||
|
||||
#include <string>
|
||||
|
||||
@ -40,4 +40,4 @@ public:
|
||||
virtual ~WalletInitInterface() {}
|
||||
};
|
||||
|
||||
#endif // WALLETINITINTERFACE_H
|
||||
#endif // BITCOIN_WALLETINITINTERFACE_H
|
||||
|
Loading…
Reference in New Issue
Block a user