Compare commits

...

26 Commits

Author SHA1 Message Date
Bart
b6a09a4d2c release: Bump version to 3.2.0-b3 2026-04-01 13:27:58 -04:00
Valentin Balaschenko
3adad49c86 fix: Remove fatal assertion on Linux thread name truncation (#6690) 2026-04-01 13:27:23 -04:00
Alex Kremer
f04943fc50 chore: Enable clang-tidy coreguidelines checks (#6698)
Co-authored-by: Ayaz Salikhov <mathbunnyru@users.noreply.github.com>
2026-04-01 13:27:23 -04:00
Ayaz Salikhov
ab7f683b2f ci: Allow uploading artifacts for XRPLF org (#6702) 2026-04-01 13:27:23 -04:00
Vito Tumas
14749fdfb0 fix: Enforce aggregate MaximumAmount in multi-send MPT (#6644)
Co-authored-by: xrplf-ai-reviewer[bot] <266832837+xrplf-ai-reviewer[bot]@users.noreply.github.com>
2026-04-01 13:27:22 -04:00
Ayaz Salikhov
c6ddf6aa1c chore: Use nudb recipe from the upstream (#6701) 2026-04-01 13:27:22 -04:00
Mayukha Vadari
ee3a08c8d4 fix: Fix previous ledger size typo in RCLConsensus (#6696) 2026-04-01 13:27:22 -04:00
Alex Kremer
2dc705bd99 chore: Enable clang-tidy misc checks (#6655) 2026-04-01 13:27:22 -04:00
Ayaz Salikhov
7315c57edc ci: Use pull_request_target to check for signed commits (#6697) 2026-04-01 13:27:22 -04:00
Bart
5a66086fce chore: Remove unnecessary clang-format off/on directives (#6682)
Co-authored-by: Bart <11445373+bthomee@users.noreply.github.com>
2026-04-01 13:27:21 -04:00
Pratik Mankawde
682dda8bfc fix: Fix Workers::stop() race between m_allPaused and m_runningTaskCount (#6574)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 13:27:21 -04:00
Bart
aac17f588a release: Bump version to 3.2.0-b2 2026-03-30 14:52:51 -04:00
Ayaz Salikhov
cbc09b2999 ci: Only publish docs in public repos (#6687) 2026-03-30 14:52:09 -04:00
Alex Kremer
453d94da17 chore: Enable remaining clang-tidy performance checks (#6648)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-30 14:52:09 -04:00
Jingchen
b36aedb4d5 refactor: Address PR comments after the modularisation PRs (#6389)
Signed-off-by: JCW <a1q123456@users.noreply.github.com>
Co-authored-by: Bart <bthomee@users.noreply.github.com>
2026-03-30 14:52:09 -04:00
Alex Kremer
18540c97a5 chore: Fix clang-tidy header filter (#6686) 2026-03-30 14:52:08 -04:00
dependabot[bot]
8e3d87fce3 ci: [DEPENDABOT] bump actions/deploy-pages from 4.0.5 to 5.0.0 (#6684)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-30 14:52:08 -04:00
dependabot[bot]
b83dc9aa16 ci: [DEPENDABOT] bump codecov/codecov-action from 5.5.3 to 6.0.0 (#6685)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-30 14:52:08 -04:00
Pratik Mankawde
0c76bf991a fix: Guard Coro::resume() against completed coroutines (#6608)
Signed-off-by: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 14:52:08 -04:00
Vito Tumas
29aba28f5b refactor: Split LoanInvariant into LoanBrokerInvariant and LoanInvariant (#6674) 2026-03-30 14:52:08 -04:00
Ayaz Salikhov
b3f14c4052 ci: Don't publish docs on release branches (#6673) 2026-03-30 14:52:08 -04:00
Jingchen
e26624dcd1 refactor: Make function naming in ServiceRegistry consistent (#6390)
Signed-off-by: JCW <a1q123456@users.noreply.github.com>
Co-authored-by: Ed Hennis <ed@ripple.com>
2026-03-30 14:52:08 -04:00
Valentin Balaschenko
885f7b8c33 chore: Shorten job names to stay within Linux 15-char thread limit (#6669) 2026-03-30 14:52:07 -04:00
Vito Tumas
dcf973bc50 fix: Improve loan invariant message (#6668) 2026-03-30 14:52:07 -04:00
Ayaz Salikhov
68596f60d8 ci: Upload artifacts only in public repositories (#6670) 2026-03-30 14:52:07 -04:00
Bart
aac64d3b85 Update version (#6672) 2026-03-26 09:50:04 -04:00
625 changed files with 6567 additions and 6506 deletions

View File

@@ -1,4 +1,6 @@
--- ---
# This entire group of checks was applied to all cpp files but not all header files.
# ---
Checks: "-*, Checks: "-*,
bugprone-argument-comment, bugprone-argument-comment,
bugprone-assert-side-effect, bugprone-assert-side-effect,
@@ -8,26 +10,26 @@ Checks: "-*,
bugprone-chained-comparison, bugprone-chained-comparison,
bugprone-compare-pointer-to-member-virtual-function, bugprone-compare-pointer-to-member-virtual-function,
bugprone-copy-constructor-init, bugprone-copy-constructor-init,
bugprone-crtp-constructor-accessibility, # bugprone-crtp-constructor-accessibility, # has issues
bugprone-dangling-handle, bugprone-dangling-handle,
bugprone-dynamic-static-initializers, bugprone-dynamic-static-initializers,
bugprone-empty-catch, # bugprone-empty-catch, # has issues
bugprone-fold-init-type, bugprone-fold-init-type,
bugprone-forward-declaration-namespace, # bugprone-forward-declaration-namespace, # has issues
bugprone-inaccurate-erase, # bugprone-inaccurate-erase,
bugprone-inc-dec-in-conditions, # bugprone-inc-dec-in-conditions,
bugprone-incorrect-enable-if, # bugprone-incorrect-enable-if,
bugprone-incorrect-roundings, # bugprone-incorrect-roundings,
bugprone-infinite-loop, # bugprone-infinite-loop,
bugprone-integer-division, # bugprone-integer-division,
bugprone-lambda-function-name, bugprone-lambda-function-name,
bugprone-macro-parentheses, # bugprone-macro-parentheses, # has issues
bugprone-macro-repeated-side-effects, bugprone-macro-repeated-side-effects,
bugprone-misplaced-operator-in-strlen-in-alloc, bugprone-misplaced-operator-in-strlen-in-alloc,
bugprone-misplaced-pointer-arithmetic-in-alloc, bugprone-misplaced-pointer-arithmetic-in-alloc,
bugprone-misplaced-widening-cast, bugprone-misplaced-widening-cast,
bugprone-move-forwarding-reference, bugprone-move-forwarding-reference,
bugprone-multi-level-implicit-pointer-conversion, # bugprone-multi-level-implicit-pointer-conversion, # has issues
bugprone-multiple-new-in-one-expression, bugprone-multiple-new-in-one-expression,
bugprone-multiple-statement-macro, bugprone-multiple-statement-macro,
bugprone-no-escape, bugprone-no-escape,
@@ -37,13 +39,13 @@ Checks: "-*,
bugprone-pointer-arithmetic-on-polymorphic-object, bugprone-pointer-arithmetic-on-polymorphic-object,
bugprone-posix-return, bugprone-posix-return,
bugprone-redundant-branch-condition, bugprone-redundant-branch-condition,
bugprone-reserved-identifier, # bugprone-reserved-identifier, # has issues
bugprone-return-const-ref-from-parameter, # bugprone-return-const-ref-from-parameter, # has issues
bugprone-shared-ptr-array-mismatch, bugprone-shared-ptr-array-mismatch,
bugprone-signal-handler, bugprone-signal-handler,
bugprone-signed-char-misuse, bugprone-signed-char-misuse,
bugprone-sizeof-container, bugprone-sizeof-container,
bugprone-sizeof-expression, # bugprone-sizeof-expression, # has issues
bugprone-spuriously-wake-up-functions, bugprone-spuriously-wake-up-functions,
bugprone-standalone-empty, bugprone-standalone-empty,
bugprone-string-constructor, bugprone-string-constructor,
@@ -60,7 +62,7 @@ Checks: "-*,
bugprone-suspicious-string-compare, bugprone-suspicious-string-compare,
bugprone-suspicious-stringview-data-usage, bugprone-suspicious-stringview-data-usage,
bugprone-swapped-arguments, bugprone-swapped-arguments,
bugprone-switch-missing-default-case, # bugprone-switch-missing-default-case, # has issues
bugprone-terminating-continue, bugprone-terminating-continue,
bugprone-throw-keyword-missing, bugprone-throw-keyword-missing,
bugprone-too-small-loop-variable, bugprone-too-small-loop-variable,
@@ -71,7 +73,7 @@ Checks: "-*,
bugprone-unhandled-self-assignment, bugprone-unhandled-self-assignment,
bugprone-unique-ptr-array-mismatch, bugprone-unique-ptr-array-mismatch,
bugprone-unsafe-functions, bugprone-unsafe-functions,
bugprone-use-after-move, # bugprone-use-after-move, # has issues
bugprone-unused-raii, bugprone-unused-raii,
bugprone-unused-return-value, bugprone-unused-return-value,
bugprone-unused-local-non-trivial-variable, bugprone-unused-local-non-trivial-variable,
@@ -85,9 +87,11 @@ Checks: "-*,
cppcoreguidelines-use-default-member-init, cppcoreguidelines-use-default-member-init,
cppcoreguidelines-virtual-class-destructor, cppcoreguidelines-virtual-class-destructor,
hicpp-ignored-remove-result, hicpp-ignored-remove-result,
misc-const-correctness,
misc-definitions-in-headers, misc-definitions-in-headers,
misc-header-include-cycle, misc-header-include-cycle,
misc-misplaced-const, misc-misplaced-const,
misc-redundant-expression,
misc-static-assert, misc-static-assert,
misc-throw-by-value-catch-by-reference, misc-throw-by-value-catch-by-reference,
misc-unused-alias-decls, misc-unused-alias-decls,
@@ -95,46 +99,49 @@ Checks: "-*,
modernize-deprecated-headers, modernize-deprecated-headers,
modernize-make-shared, modernize-make-shared,
modernize-make-unique, modernize-make-unique,
llvm-namespace-comment,
performance-faster-string-find,
performance-for-range-copy,
performance-implicit-conversion-in-loop, performance-implicit-conversion-in-loop,
performance-inefficient-vector-operation,
performance-move-const-arg,
performance-move-constructor-init, performance-move-constructor-init,
performance-no-automatic-move,
performance-trivially-destructible, performance-trivially-destructible,
readability-avoid-nested-conditional-operator, # readability-avoid-nested-conditional-operator, # has issues
readability-avoid-return-with-void-value, # readability-avoid-return-with-void-value, # has issues
readability-braces-around-statements, # readability-braces-around-statements, # has issues
readability-const-return-type, # readability-const-return-type, # has issues
readability-container-contains, # readability-container-contains, # has issues
readability-container-size-empty, # readability-container-size-empty, # has issues
readability-convert-member-functions-to-static, # readability-convert-member-functions-to-static, # has issues
readability-duplicate-include, readability-duplicate-include,
readability-else-after-return, # readability-else-after-return, # has issues
readability-enum-initial-value, # readability-enum-initial-value, # has issues
readability-implicit-bool-conversion, # readability-implicit-bool-conversion, # has issues
readability-make-member-function-const, # readability-make-member-function-const, # has issues
readability-math-missing-parentheses, # readability-math-missing-parentheses, # has issues
readability-misleading-indentation, readability-misleading-indentation,
readability-non-const-parameter, readability-non-const-parameter,
readability-redundant-casting, # readability-redundant-casting, # has issues
readability-redundant-declaration, # readability-redundant-declaration, # has issues
readability-redundant-inline-specifier, # readability-redundant-inline-specifier, # has issues
readability-redundant-member-init, # readability-redundant-member-init, # has issues
readability-redundant-string-init, readability-redundant-string-init,
readability-reference-to-constructed-temporary, readability-reference-to-constructed-temporary,
readability-simplify-boolean-expr, # readability-simplify-boolean-expr, # has issues
readability-static-definition-in-anonymous-namespace, # readability-static-definition-in-anonymous-namespace, # has issues
readability-suspicious-call-argument, # readability-suspicious-call-argument, # has issues
readability-use-std-min-max readability-use-std-min-max
" "
# --- # ---
# checks that have some issues that need to be resolved: # other checks that have issues that need to be resolved:
# #
# llvm-namespace-comment,
# misc-const-correctness,
# misc-include-cleaner, # misc-include-cleaner,
# misc-redundant-expression,
# #
# readability-inconsistent-declaration-parameter-name, # in this codebase this check will break a lot of arg names # readability-inconsistent-declaration-parameter-name, # in this codebase this check will break a lot of arg names
# readability-static-accessed-through-instance, # this check is probably unnecessary. it makes the code less readable # readability-static-accessed-through-instance, # this check is probably unnecessary. it makes the code less readable
# readability-identifier-naming, # readability-identifier-naming, # https://github.com/XRPLF/rippled/pull/6571
# #
# modernize-concat-nested-namespaces, # modernize-concat-nested-namespaces,
# modernize-pass-by-value, # modernize-pass-by-value,
@@ -148,12 +155,6 @@ Checks: "-*,
# modernize-use-starts-ends-with, # modernize-use-starts-ends-with,
# modernize-use-std-numbers, # modernize-use-std-numbers,
# modernize-use-using, # modernize-use-using,
#
# performance-faster-string-find,
# performance-for-range-copy,
# performance-inefficient-vector-operation,
# performance-move-const-arg,
# performance-no-automatic-move,
# --- # ---
# #
CheckOptions: CheckOptions:
@@ -195,5 +196,6 @@ CheckOptions:
bugprone-unused-return-value.CheckedReturnTypes: ::std::error_code;::std::error_condition;::std::errc bugprone-unused-return-value.CheckedReturnTypes: ::std::error_code;::std::error_condition;::std::errc
# misc-include-cleaner.IgnoreHeaders: '.*/(detail|impl)/.*;.*(expected|unexpected).*;.*ranges_lower_bound\.h;time.h;stdlib.h;__chrono/.*;fmt/chrono.h;boost/uuid/uuid_hash.hpp' # misc-include-cleaner.IgnoreHeaders: '.*/(detail|impl)/.*;.*(expected|unexpected).*;.*ranges_lower_bound\.h;time.h;stdlib.h;__chrono/.*;fmt/chrono.h;boost/uuid/uuid_hash.hpp'
# #
# HeaderFilterRegex: '^.*/(src|tests)/.*\.(h|hpp)$' HeaderFilterRegex: '^.*/(test|xrpl|xrpld)/.*\.(h|hpp)$'
ExcludeHeaderFilterRegex: '^.*/protocol_autogen/.*\.(h|hpp)$'
WarningsAsErrors: "*" WarningsAsErrors: "*"

View File

@@ -21,6 +21,7 @@ libxrpl.protocol > xrpl.json
libxrpl.protocol > xrpl.protocol libxrpl.protocol > xrpl.protocol
libxrpl.protocol_autogen > xrpl.protocol_autogen libxrpl.protocol_autogen > xrpl.protocol_autogen
libxrpl.rdb > xrpl.basics libxrpl.rdb > xrpl.basics
libxrpl.rdb > xrpl.core
libxrpl.rdb > xrpl.rdb libxrpl.rdb > xrpl.rdb
libxrpl.resource > xrpl.basics libxrpl.resource > xrpl.basics
libxrpl.resource > xrpl.json libxrpl.resource > xrpl.json
@@ -184,7 +185,6 @@ xrpl.conditions > xrpl.basics
xrpl.conditions > xrpl.protocol xrpl.conditions > xrpl.protocol
xrpl.core > xrpl.basics xrpl.core > xrpl.basics
xrpl.core > xrpl.json xrpl.core > xrpl.json
xrpl.core > xrpl.ledger
xrpl.core > xrpl.protocol xrpl.core > xrpl.protocol
xrpl.json > xrpl.basics xrpl.json > xrpl.basics
xrpl.ledger > xrpl.basics xrpl.ledger > xrpl.basics

View File

@@ -1,7 +1,7 @@
name: Check PR commits name: Check PR commits
on: on:
pull_request: pull_request_target:
# The action needs to have write permissions to post comments on the PR. # The action needs to have write permissions to post comments on the PR.
permissions: permissions:

View File

@@ -6,7 +6,6 @@ on:
push: push:
branches: branches:
- "develop" - "develop"
- "release*"
paths: paths:
- ".github/workflows/publish-docs.yml" - ".github/workflows/publish-docs.yml"
- "*.md" - "*.md"
@@ -37,7 +36,7 @@ env:
BUILD_DIR: build BUILD_DIR: build
# ubuntu-latest has only 2 CPUs for private repositories # ubuntu-latest has only 2 CPUs for private repositories
# https://docs.github.com/en/actions/reference/runners/github-hosted-runners#standard-github-hosted-runners-for--private-repositories # https://docs.github.com/en/actions/reference/runners/github-hosted-runners#standard-github-hosted-runners-for--private-repositories
NPROC_SUBTRACT: ${{ github.event.repository.private && '1' || '2' }} NPROC_SUBTRACT: ${{ github.event.repository.visibility == 'public' && '2' || '1' }}
jobs: jobs:
build: build:
@@ -82,13 +81,13 @@ jobs:
cmake --build . --target docs --parallel ${BUILD_NPROC} cmake --build . --target docs --parallel ${BUILD_NPROC}
- name: Create documentation artifact - name: Create documentation artifact
if: ${{ github.event_name == 'push' }} if: ${{ (github.repository_owner == 'XRPLF' || github.event.repository.visibility == 'public') && github.event_name == 'push' }}
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
with: with:
path: ${{ env.BUILD_DIR }}/docs/html path: ${{ env.BUILD_DIR }}/docs/html
deploy: deploy:
if: ${{ github.event_name == 'push' }} if: ${{ (github.repository_owner == 'XRPLF' || github.event.repository.visibility == 'public') && github.event_name == 'push' }}
needs: build needs: build
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
@@ -100,4 +99,4 @@ jobs:
steps: steps:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deploy id: deploy
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0

View File

@@ -199,7 +199,7 @@ jobs:
fi fi
- name: Upload the binary (Linux) - name: Upload the binary (Linux)
if: ${{ github.repository == 'XRPLF/rippled' && runner.os == 'Linux' }} if: ${{ (github.repository_owner == 'XRPLF' || github.event.repository.visibility == 'public') && runner.os == 'Linux' }}
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with: with:
name: xrpld-${{ inputs.config_name }} name: xrpld-${{ inputs.config_name }}
@@ -298,7 +298,7 @@ jobs:
- name: Upload coverage report - name: Upload coverage report
if: ${{ github.repository == 'XRPLF/rippled' && !inputs.build_only && env.COVERAGE_ENABLED == 'true' }} if: ${{ github.repository == 'XRPLF/rippled' && !inputs.build_only && env.COVERAGE_ENABLED == 'true' }}
uses: codecov/codecov-action@1af58845a975a7985b0beb0cbe6fbbb71a41dbad # v5.5.3 uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with: with:
disable_search: true disable_search: true
disable_telem: true disable_telem: true

View File

@@ -80,10 +80,10 @@ jobs:
env: env:
TARGETS: ${{ inputs.files != '' && inputs.files || 'src tests' }} TARGETS: ${{ inputs.files != '' && inputs.files || 'src tests' }}
run: | run: |
run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "${BUILD_DIR}" ${TARGETS} 2>&1 | tee clang-tidy-output.txt run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "${BUILD_DIR}" -quiet -allow-no-checks ${TARGETS} 2>&1 | tee clang-tidy-output.txt
- name: Upload clang-tidy output - name: Upload clang-tidy output
if: steps.run_clang_tidy.outcome != 'success' if: ${{ (github.repository_owner == 'XRPLF' || github.event.repository.visibility == 'public') && steps.run_clang_tidy.outcome != 'success' }}
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with: with:
name: clang-tidy-results name: clang-tidy-results

View File

@@ -141,7 +141,7 @@ Alternatively, you can pull our recipes from the repository and export them loca
```bash ```bash
# Define which recipes to export. # Define which recipes to export.
recipes=('abseil' 'ed25519' 'grpc' 'm4' 'mpt-crypto' 'nudb' 'openssl' 'secp256k1' 'snappy' 'soci' 'wasm-xrplf' 'wasmi') recipes=('abseil' 'ed25519' 'grpc' 'm4' 'mpt-crypto' 'openssl' 'secp256k1' 'snappy' 'soci' 'wasm-xrplf' 'wasmi')
# Selectively check out the recipes from our CCI fork. # Selectively check out the recipes from our CCI fork.
cd external cd external

View File

@@ -270,14 +270,14 @@ Before running clang-tidy, you must build the project to generate required files
Then run clang-tidy on your local changes: Then run clang-tidy on your local changes:
``` ```
run-clang-tidy -p build src include tests run-clang-tidy -p build -allow-no-checks src tests
``` ```
This will check all source files in the `src`, `include` and `tests` directories using the compile commands from your `build` directory. This will check all source files in the `src`, `include` and `tests` directories using the compile commands from your `build` directory.
If you wish to automatically fix whatever clang-tidy finds _and_ is capable of fixing, add `-fix` to the above command: If you wish to automatically fix whatever clang-tidy finds _and_ is capable of fixing, add `-fix` to the above command:
``` ```
run-clang-tidy -p build -fix src include tests run-clang-tidy -p build -quiet -fix -allow-no-checks src tests
``` ```
## Contracts and instrumentation ## Contracts and instrumentation

View File

@@ -3,22 +3,22 @@
"requires": [ "requires": [
"zlib/1.3.1#cac0f6daea041b0ccf42934163defb20%1774439233.809", "zlib/1.3.1#cac0f6daea041b0ccf42934163defb20%1774439233.809",
"xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1765850149.987", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1765850149.987",
"sqlite3/3.51.0#66aa11eabd0e34954c5c1c061ad44abe%1763899256.358", "sqlite3/3.51.0#66aa11eabd0e34954c5c1c061ad44abe%1774467355.988",
"soci/4.0.3#fe32b9ad5eb47e79ab9e45a68f363945%1774450067.231", "soci/4.0.3#fe32b9ad5eb47e79ab9e45a68f363945%1774450067.231",
"snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1765850147.878", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1765850147.878",
"secp256k1/0.7.1#481881709eb0bdd0185a12b912bbe8ad%1770910500.329", "secp256k1/0.7.1#481881709eb0bdd0185a12b912bbe8ad%1770910500.329",
"rocksdb/10.5.1#4a197eca381a3e5ae8adf8cffa5aacd0%1765850186.86", "rocksdb/10.5.1#4a197eca381a3e5ae8adf8cffa5aacd0%1765850186.86",
"re2/20251105#8579cfd0bda4daf0683f9e3898f964b4%1774398111.888", "re2/20251105#8579cfd0bda4daf0683f9e3898f964b4%1774398111.888",
"protobuf/6.33.5#d96d52ba5baaaa532f47bda866ad87a5%1773224203.27", "protobuf/6.33.5#d96d52ba5baaaa532f47bda866ad87a5%1774467363.12",
"openssl/3.6.1#e6399de266349245a4542fc5f6c71552%1774458290.139", "openssl/3.6.1#e6399de266349245a4542fc5f6c71552%1774458290.139",
"nudb/2.0.9#0432758a24204da08fee953ec9ea03cb%1769436073.32", "nudb/2.0.9#11149c73f8f2baff9a0198fe25971fc7%1774883011.384",
"lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1765850143.914", "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1765850143.914",
"libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1765842973.492", "libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1765842973.492",
"libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1765842973.03", "libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1765842973.03",
"libarchive/3.8.1#ffee18995c706e02bf96e7a2f7042e0d%1765850144.736", "libarchive/3.8.1#ffee18995c706e02bf96e7a2f7042e0d%1765850144.736",
"jemalloc/5.3.0#e951da9cf599e956cebc117880d2d9f8%1729241615.244", "jemalloc/5.3.0#e951da9cf599e956cebc117880d2d9f8%1729241615.244",
"gtest/1.17.0#5224b3b3ff3b4ce1133cbdd27d53ee7d%1768312129.152", "gtest/1.17.0#5224b3b3ff3b4ce1133cbdd27d53ee7d%1768312129.152",
"grpc/1.78.1#b1a9e74b145cc471bed4dc64dc6eb2c1%1772623605.068", "grpc/1.78.1#b1a9e74b145cc471bed4dc64dc6eb2c1%1774467387.342",
"ed25519/2015.03#ae761bdc52730a843f0809bdf6c1b1f6%1765850143.772", "ed25519/2015.03#ae761bdc52730a843f0809bdf6c1b1f6%1765850143.772",
"date/3.0.4#862e11e80030356b53c2c38599ceb32b%1765850143.772", "date/3.0.4#862e11e80030356b53c2c38599ceb32b%1765850143.772",
"c-ares/1.34.6#545240bb1c40e2cacd4362d6b8967650%1774439234.681", "c-ares/1.34.6#545240bb1c40e2cacd4362d6b8967650%1774439234.681",
@@ -29,7 +29,7 @@
"build_requires": [ "build_requires": [
"zlib/1.3.1#cac0f6daea041b0ccf42934163defb20%1774439233.809", "zlib/1.3.1#cac0f6daea041b0ccf42934163defb20%1774439233.809",
"strawberryperl/5.32.1.1#8d114504d172cfea8ea1662d09b6333e%1774447376.964", "strawberryperl/5.32.1.1#8d114504d172cfea8ea1662d09b6333e%1774447376.964",
"protobuf/6.33.5#d96d52ba5baaaa532f47bda866ad87a5%1773224203.27", "protobuf/6.33.5#d96d52ba5baaaa532f47bda866ad87a5%1774467363.12",
"nasm/2.16.01#31e26f2ee3c4346ecd347911bd126904%1765850144.707", "nasm/2.16.01#31e26f2ee3c4346ecd347911bd126904%1765850144.707",
"msys2/cci.latest#d22fe7b2808f5fd34d0a7923ace9c54f%1770657326.649", "msys2/cci.latest#d22fe7b2808f5fd34d0a7923ace9c54f%1770657326.649",
"m4/1.4.19#5d7a4994e5875d76faf7acf3ed056036%1774365463.87", "m4/1.4.19#5d7a4994e5875d76faf7acf3ed056036%1774365463.87",
@@ -41,16 +41,15 @@
], ],
"python_requires": [], "python_requires": [],
"overrides": { "overrides": {
"boost/1.90.0#d5e8defe7355494953be18524a7f135b": [
null,
"boost/1.90.0"
],
"protobuf/[>=5.27.0 <7]": [ "protobuf/[>=5.27.0 <7]": [
"protobuf/6.33.5" "protobuf/6.33.5"
], ],
"lz4/1.9.4": [ "lz4/1.9.4": [
"lz4/1.10.0" "lz4/1.10.0"
], ],
"boost/[>=1.83.0 <1.91.0]": [
"boost/1.90.0"
],
"sqlite3/[>=3.44 <4]": [ "sqlite3/[>=3.44 <4]": [
"sqlite3/3.51.0" "sqlite3/3.51.0"
], ],

View File

@@ -311,7 +311,7 @@ template <class T>
bool bool
set(T& target, T const& defaultValue, std::string const& name, Section const& section) set(T& target, T const& defaultValue, std::string const& name, Section const& section)
{ {
bool found_and_valid = set<T>(target, name, section); bool const found_and_valid = set<T>(target, name, section);
if (!found_and_valid) if (!found_and_valid)
target = defaultValue; target = defaultValue;
return found_and_valid; return found_and_valid;

View File

@@ -34,7 +34,7 @@ public:
{ {
// Insert ourselves at the front of the lock-free linked list // Insert ourselves at the front of the lock-free linked list
CountedObjects& instance = CountedObjects::getInstance(); CountedObjects& instance = CountedObjects::getInstance();
Counter* head; Counter* head = nullptr;
do do
{ {

View File

@@ -93,7 +93,7 @@ class DecayWindow
public: public:
using time_point = typename Clock::time_point; using time_point = typename Clock::time_point;
explicit DecayWindow(time_point now) : value_(0), when_(now) explicit DecayWindow(time_point now) : when_(now)
{ {
} }
@@ -125,7 +125,7 @@ private:
when_ = now; when_ = now;
} }
double value_; double value_{0};
time_point when_; time_point when_;
}; };

View File

@@ -84,7 +84,8 @@ public:
template <class TT> template <class TT>
requires std::convertible_to<TT*, T*> requires std::convertible_to<TT*, T*>
SharedIntrusive(SharedIntrusive<TT>&& rhs); SharedIntrusive(
SharedIntrusive<TT>&& rhs); // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
SharedIntrusive& SharedIntrusive&
operator=(SharedIntrusive const& rhs); operator=(SharedIntrusive const& rhs);
@@ -106,7 +107,8 @@ public:
template <class TT> template <class TT>
requires std::convertible_to<TT*, T*> requires std::convertible_to<TT*, T*>
SharedIntrusive& SharedIntrusive&
operator=(SharedIntrusive<TT>&& rhs); operator=(
SharedIntrusive<TT>&& rhs); // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
/** Adopt the raw pointer. The strong reference may or may not be /** Adopt the raw pointer. The strong reference may or may not be
incremented, depending on the TAdoptTag incremented, depending on the TAdoptTag
@@ -314,7 +316,8 @@ public:
template <class TT> template <class TT>
requires std::convertible_to<TT*, T*> requires std::convertible_to<TT*, T*>
SharedWeakUnion(SharedIntrusive<TT>&& rhs); SharedWeakUnion(
SharedIntrusive<TT>&& rhs); // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
SharedWeakUnion& SharedWeakUnion&
operator=(SharedWeakUnion const& rhs); operator=(SharedWeakUnion const& rhs);
@@ -327,7 +330,8 @@ public:
template <class TT> template <class TT>
requires std::convertible_to<TT*, T*> requires std::convertible_to<TT*, T*>
SharedWeakUnion& SharedWeakUnion&
operator=(SharedIntrusive<TT>&& rhs); operator=(
SharedIntrusive<TT>&& rhs); // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
~SharedWeakUnion(); ~SharedWeakUnion();

View File

@@ -68,9 +68,7 @@ SharedIntrusive<T>::operator=(SharedIntrusive const& rhs)
template <class T> template <class T>
template <class TT> template <class TT>
// clang-format off requires std::convertible_to<TT*, T*>
requires std::convertible_to<TT*, T*>
// clang-format on
SharedIntrusive<T>& SharedIntrusive<T>&
SharedIntrusive<T>::operator=(SharedIntrusive<TT> const& rhs) SharedIntrusive<T>::operator=(SharedIntrusive<TT> const& rhs)
{ {
@@ -101,9 +99,7 @@ SharedIntrusive<T>::operator=(SharedIntrusive&& rhs)
template <class T> template <class T>
template <class TT> template <class TT>
// clang-format off requires std::convertible_to<TT*, T*>
requires std::convertible_to<TT*, T*>
// clang-format on
SharedIntrusive<T>& SharedIntrusive<T>&
SharedIntrusive<T>::operator=(SharedIntrusive<TT>&& rhs) SharedIntrusive<T>::operator=(SharedIntrusive<TT>&& rhs)
{ {
@@ -307,9 +303,7 @@ WeakIntrusive<T>::WeakIntrusive(SharedIntrusive<T> const& rhs) : ptr_{rhs.unsafe
template <class T> template <class T>
template <class TT> template <class TT>
// clang-format off requires std::convertible_to<TT*, T*>
requires std::convertible_to<TT*, T*>
// clang-format on
WeakIntrusive<T>& WeakIntrusive<T>&
WeakIntrusive<T>::operator=(SharedIntrusive<TT> const& rhs) WeakIntrusive<T>::operator=(SharedIntrusive<TT> const& rhs)
{ {
@@ -454,9 +448,7 @@ SharedWeakUnion<T>::operator=(SharedWeakUnion const& rhs)
template <class T> template <class T>
template <class TT> template <class TT>
// clang-format off requires std::convertible_to<TT*, T*>
requires std::convertible_to<TT*, T*>
// clang-format on
SharedWeakUnion<T>& SharedWeakUnion<T>&
SharedWeakUnion<T>::operator=(SharedIntrusive<TT> const& rhs) SharedWeakUnion<T>::operator=(SharedIntrusive<TT> const& rhs)
{ {
@@ -470,9 +462,7 @@ SharedWeakUnion<T>::operator=(SharedIntrusive<TT> const& rhs)
template <class T> template <class T>
template <class TT> template <class TT>
// clang-format off requires std::convertible_to<TT*, T*>
requires std::convertible_to<TT*, T*>
// clang-format on
SharedWeakUnion<T>& SharedWeakUnion<T>&
SharedWeakUnion<T>::operator=(SharedIntrusive<TT>&& rhs) SharedWeakUnion<T>::operator=(SharedIntrusive<TT>&& rhs)
{ {

View File

@@ -448,7 +448,7 @@ inline void
partialDestructorFinished(T** o) partialDestructorFinished(T** o)
{ {
T& self = **o; T& self = **o;
IntrusiveRefCounts::RefCountPair p = IntrusiveRefCounts::RefCountPair const p =
self.refCounts.fetch_or(IntrusiveRefCounts::partialDestroyFinishedMask); self.refCounts.fetch_or(IntrusiveRefCounts::partialDestroyFinishedMask);
XRPL_ASSERT( XRPL_ASSERT(
(!p.partialDestroyFinishedBit && p.partialDestroyStartedBit && !p.strong), (!p.partialDestroyFinishedBit && p.partialDestroyStartedBit && !p.strong),

View File

@@ -73,12 +73,12 @@ struct MantissaRange
enum mantissa_scale { small, large }; enum mantissa_scale { small, large };
explicit constexpr MantissaRange(mantissa_scale scale_) explicit constexpr MantissaRange(mantissa_scale scale_)
: min(getMin(scale_)), max(min * 10 - 1), log(logTen(min).value_or(-1)), scale(scale_) : min(getMin(scale_)), log(logTen(min).value_or(-1)), scale(scale_)
{ {
} }
rep min; rep min;
rep max; rep max{min * 10 - 1};
int log; int log;
mantissa_scale scale; mantissa_scale scale;

View File

@@ -91,10 +91,10 @@ class SlabAllocator
std::uint8_t* std::uint8_t*
allocate() noexcept allocate() noexcept
{ {
std::uint8_t* ret; std::uint8_t* ret = nullptr; // NOLINT(misc-const-correctness)
{ {
std::lock_guard l(m_); std::lock_guard const l(m_);
ret = l_; ret = l_;
@@ -123,7 +123,7 @@ class SlabAllocator
{ {
XRPL_ASSERT(own(ptr), "xrpl::SlabAllocator::SlabBlock::deallocate : own input"); XRPL_ASSERT(own(ptr), "xrpl::SlabAllocator::SlabBlock::deallocate : own input");
std::lock_guard l(m_); std::lock_guard const l(m_);
// Use memcpy to avoid unaligned UB // Use memcpy to avoid unaligned UB
// (will optimize to equivalent code) // (will optimize to equivalent code)
@@ -210,16 +210,13 @@ public:
// No slab can satisfy our request, so we attempt to allocate a new // No slab can satisfy our request, so we attempt to allocate a new
// one here: // one here:
std::size_t size = slabSize_; std::size_t const size = slabSize_;
// We want to allocate the memory at a 2 MiB boundary, to make it // We want to allocate the memory at a 2 MiB boundary, to make it
// possible to use hugepage mappings on Linux: // possible to use hugepage mappings on Linux:
auto buf = boost::alignment::aligned_alloc(megabytes(std::size_t(2)), size); auto buf = boost::alignment::aligned_alloc(megabytes(std::size_t(2)), size);
// clang-format off
if (!buf) [[unlikely]] if (!buf) [[unlikely]]
return nullptr; return nullptr;
// clang-format on
#if BOOST_OS_LINUX #if BOOST_OS_LINUX
// When allocating large blocks, attempt to leverage Linux's // When allocating large blocks, attempt to leverage Linux's

View File

@@ -66,12 +66,12 @@ strUnHex(std::size_t strSize, Iterator begin, Iterator end)
while (iter != end) while (iter != end)
{ {
int cHigh = digitLookupTable[*iter++]; int const cHigh = digitLookupTable[*iter++];
if (cHigh < 0) if (cHigh < 0)
return {}; return {};
int cLow = digitLookupTable[*iter++]; int const cLow = digitLookupTable[*iter++];
if (cLow < 0) if (cLow < 0)
return {}; return {};

View File

@@ -182,8 +182,7 @@ private:
: hook(collector->make_hook(handler)) : hook(collector->make_hook(handler))
, size(collector->make_gauge(prefix, "size")) , size(collector->make_gauge(prefix, "size"))
, hit_rate(collector->make_gauge(prefix, "hit_rate")) , hit_rate(collector->make_gauge(prefix, "hit_rate"))
, hits(0)
, misses(0)
{ {
} }
@@ -191,8 +190,8 @@ private:
beast::insight::Gauge size; beast::insight::Gauge size;
beast::insight::Gauge hit_rate; beast::insight::Gauge hit_rate;
std::size_t hits; std::size_t hits{0};
std::size_t misses; std::size_t misses{0};
}; };
class KeyOnlyEntry class KeyOnlyEntry
@@ -294,10 +293,10 @@ private:
clock_type::duration const m_target_age; clock_type::duration const m_target_age;
// Number of items cached // Number of items cached
int m_cache_count; int m_cache_count{0};
cache_type m_cache; // Hold strong reference to recent objects cache_type m_cache; // Hold strong reference to recent objects
std::uint64_t m_hits; std::uint64_t m_hits{0};
std::uint64_t m_misses; std::uint64_t m_misses{0};
}; };
} // namespace xrpl } // namespace xrpl

View File

@@ -36,9 +36,7 @@ inline TaggedCache<
, m_name(name) , m_name(name)
, m_target_size(size) , m_target_size(size)
, m_target_age(expiration) , m_target_age(expiration)
, m_cache_count(0)
, m_hits(0)
, m_misses(0)
{ {
} }

View File

@@ -212,7 +212,7 @@ private:
while (in != sv.end()) while (in != sv.end())
{ {
std::uint32_t accum = {}; std::uint32_t accum = {};
for (std::uint32_t shift : {4u, 0u, 12u, 8u, 20u, 16u, 28u, 24u}) for (std::uint32_t const shift : {4u, 0u, 12u, 8u, 20u, 16u, 28u, 24u})
{ {
if (auto const result = hexCharToUInt(*in++, shift, accum); if (auto const result = hexCharToUInt(*in++, shift, accum);
result != ParseResult::okay) result != ParseResult::okay)
@@ -335,11 +335,13 @@ public:
operator=(std::uint64_t uHost) operator=(std::uint64_t uHost)
{ {
*this = beast::zero; *this = beast::zero;
// NOLINTBEGIN(cppcoreguidelines-pro-type-member-init)
union union
{ {
unsigned u[2]; unsigned u[2];
std::uint64_t ul; std::uint64_t ul;
}; };
// NOLINTEND(cppcoreguidelines-pro-type-member-init)
// Put in least significant bits. // Put in least significant bits.
ul = boost::endian::native_to_big(uHost); ul = boost::endian::native_to_big(uHost);
data_[WIDTH - 2] = u[0]; data_[WIDTH - 2] = u[0];
@@ -444,7 +446,7 @@ public:
for (int i = WIDTH; i--;) for (int i = WIDTH; i--;)
{ {
std::uint64_t n = carry + boost::endian::big_to_native(data_[i]) + std::uint64_t const n = carry + boost::endian::big_to_native(data_[i]) +
boost::endian::big_to_native(b.data_[i]); boost::endian::big_to_native(b.data_[i]);
data_[i] = boost::endian::native_to_big(static_cast<std::uint32_t>(n)); data_[i] = boost::endian::native_to_big(static_cast<std::uint32_t>(n));
@@ -621,7 +623,7 @@ template <>
inline std::size_t inline std::size_t
extract(uint256 const& key) extract(uint256 const& key)
{ {
std::size_t result; std::size_t result = 0;
// Use memcpy to avoid unaligned UB // Use memcpy to avoid unaligned UB
// (will optimize to equivalent code) // (will optimize to equivalent code)
std::memcpy(&result, key.data(), sizeof(std::size_t)); std::memcpy(&result, key.data(), sizeof(std::size_t));

View File

@@ -54,7 +54,7 @@ Throw(Args&&... args)
E e(std::forward<Args>(args)...); E e(std::forward<Args>(args)...);
LogThrow(std::string("Throwing exception of type " + beast::type_name<E>() + ": ") + e.what()); LogThrow(std::string("Throwing exception of type " + beast::type_name<E>() + ": ") + e.what());
throw e; throw std::move(e);
} }
/** Called when faulty logic causes a broken invariant. */ /** Called when faulty logic causes a broken invariant. */

View File

@@ -32,7 +32,7 @@ make_seed_pair() noexcept
// state_t& operator=(state_t const&) = delete; // state_t& operator=(state_t const&) = delete;
}; };
static state_t state; static state_t state;
std::lock_guard lock(state.mutex); std::lock_guard const lock(state.mutex);
return {state.dist(state.gen), state.dist(state.gen)}; return {state.dist(state.gen), state.dist(state.gen)};
} }

View File

@@ -14,11 +14,13 @@ namespace xrpl {
#ifndef __INTELLISENSE__ #ifndef __INTELLISENSE__
static_assert( static_assert(
// NOLINTNEXTLINE(misc-redundant-expression)
std::is_integral<beast::xor_shift_engine::result_type>::value && std::is_integral<beast::xor_shift_engine::result_type>::value &&
std::is_unsigned<beast::xor_shift_engine::result_type>::value, std::is_unsigned<beast::xor_shift_engine::result_type>::value,
"The Ripple default PRNG engine must return an unsigned integral type."); "The Ripple default PRNG engine must return an unsigned integral type.");
static_assert( static_assert(
// NOLINTNEXTLINE(misc-redundant-expression)
std::numeric_limits<beast::xor_shift_engine::result_type>::max() >= std::numeric_limits<beast::xor_shift_engine::result_type>::max() >=
std::numeric_limits<std::uint64_t>::max(), std::numeric_limits<std::uint64_t>::max(),
"The Ripple default PRNG engine return must be at least 64 bits wide."); "The Ripple default PRNG engine return must be at least 64 bits wide.");
@@ -56,9 +58,9 @@ default_prng()
// The thread-specific PRNGs: // The thread-specific PRNGs:
thread_local beast::xor_shift_engine engine = [] { thread_local beast::xor_shift_engine engine = [] {
std::uint64_t seed; std::uint64_t seed = 0;
{ {
std::lock_guard lk(m); std::lock_guard const lk(m);
std::uniform_int_distribution<std::uint64_t> distribution{1}; std::uniform_int_distribution<std::uint64_t> distribution{1};
seed = distribution(seeder); seed = distribution(seeder);
} }

View File

@@ -23,15 +23,15 @@ private:
std::recursive_mutex m_mutex; std::recursive_mutex m_mutex;
std::condition_variable_any m_cond; std::condition_variable_any m_cond;
std::size_t m_count; std::size_t m_count{1};
duration const m_period; duration const m_period;
boost::asio::io_context& m_ios; boost::asio::io_context& m_ios;
boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer; boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer;
bool m_cancel; bool m_cancel{false};
public: public:
io_latency_probe(duration const& period, boost::asio::io_context& ios) io_latency_probe(duration const& period, boost::asio::io_context& ios)
: m_count(1), m_period(period), m_ios(ios), m_timer(m_ios), m_cancel(false) : m_period(period), m_ios(ios), m_timer(m_ios)
{ {
} }
@@ -83,7 +83,7 @@ public:
void void
sample_one(Handler&& handler) sample_one(Handler&& handler)
{ {
std::lock_guard lock(m_mutex); std::lock_guard const lock(m_mutex);
if (m_cancel) if (m_cancel)
throw std::logic_error("io_latency_probe is canceled"); throw std::logic_error("io_latency_probe is canceled");
boost::asio::post( boost::asio::post(
@@ -98,7 +98,7 @@ public:
void void
sample(Handler&& handler) sample(Handler&& handler)
{ {
std::lock_guard lock(m_mutex); std::lock_guard const lock(m_mutex);
if (m_cancel) if (m_cancel)
throw std::logic_error("io_latency_probe is canceled"); throw std::logic_error("io_latency_probe is canceled");
boost::asio::post( boost::asio::post(
@@ -122,14 +122,14 @@ private:
void void
addref() addref()
{ {
std::lock_guard lock(m_mutex); std::lock_guard const lock(m_mutex);
++m_count; ++m_count;
} }
void void
release() release()
{ {
std::lock_guard lock(m_mutex); std::lock_guard const lock(m_mutex);
if (--m_count == 0) if (--m_count == 0)
m_cond.notify_all(); m_cond.notify_all();
} }
@@ -192,7 +192,7 @@ private:
m_handler(elapsed); m_handler(elapsed);
{ {
std::lock_guard lock(m_probe->m_mutex); std::lock_guard const lock(m_probe->m_mutex);
if (m_probe->m_cancel) if (m_probe->m_cancel)
return; return;
} }

View File

@@ -16,4 +16,4 @@ template <
class Allocator = std::allocator<std::pair<Key const, T>>> class Allocator = std::allocator<std::pair<Key const, T>>>
using aged_map = detail::aged_ordered_container<false, true, Key, T, Clock, Compare, Allocator>; using aged_map = detail::aged_ordered_container<false, true, Key, T, Clock, Compare, Allocator>;
} } // namespace beast

View File

@@ -16,4 +16,4 @@ template <
class Allocator = std::allocator<std::pair<Key const, T>>> class Allocator = std::allocator<std::pair<Key const, T>>>
using aged_multimap = detail::aged_ordered_container<true, true, Key, T, Clock, Compare, Allocator>; using aged_multimap = detail::aged_ordered_container<true, true, Key, T, Clock, Compare, Allocator>;
} } // namespace beast

View File

@@ -15,4 +15,4 @@ template <
class Allocator = std::allocator<Key>> class Allocator = std::allocator<Key>>
using aged_multiset = using aged_multiset =
detail::aged_ordered_container<true, false, Key, void, Clock, Compare, Allocator>; detail::aged_ordered_container<true, false, Key, void, Clock, Compare, Allocator>;
} } // namespace beast

View File

@@ -15,4 +15,4 @@ template <
class Allocator = std::allocator<Key>> class Allocator = std::allocator<Key>>
using aged_set = detail::aged_ordered_container<false, false, Key, void, Clock, Compare, Allocator>; using aged_set = detail::aged_ordered_container<false, false, Key, void, Clock, Compare, Allocator>;
} } // namespace beast

View File

@@ -17,4 +17,4 @@ template <
class Allocator = std::allocator<std::pair<Key const, T>>> class Allocator = std::allocator<std::pair<Key const, T>>>
using aged_unordered_map = using aged_unordered_map =
detail::aged_unordered_container<false, true, Key, T, Clock, Hash, KeyEqual, Allocator>; detail::aged_unordered_container<false, true, Key, T, Clock, Hash, KeyEqual, Allocator>;
} } // namespace beast

View File

@@ -17,4 +17,4 @@ template <
class Allocator = std::allocator<std::pair<Key const, T>>> class Allocator = std::allocator<std::pair<Key const, T>>>
using aged_unordered_multimap = using aged_unordered_multimap =
detail::aged_unordered_container<true, true, Key, T, Clock, Hash, KeyEqual, Allocator>; detail::aged_unordered_container<true, true, Key, T, Clock, Hash, KeyEqual, Allocator>;
} } // namespace beast

View File

@@ -17,4 +17,4 @@ template <
using aged_unordered_multiset = using aged_unordered_multiset =
detail::aged_unordered_container<true, false, Key, void, Clock, Hash, KeyEqual, Allocator>; detail::aged_unordered_container<true, false, Key, void, Clock, Hash, KeyEqual, Allocator>;
} } // namespace beast

View File

@@ -16,4 +16,4 @@ template <
class Allocator = std::allocator<Key>> class Allocator = std::allocator<Key>>
using aged_unordered_set = using aged_unordered_set =
detail::aged_unordered_container<false, false, Key, void, Clock, Hash, KeyEqual, Allocator>; detail::aged_unordered_container<false, false, Key, void, Clock, Hash, KeyEqual, Allocator>;
} } // namespace beast

View File

@@ -262,7 +262,9 @@ private:
{ {
} }
config_t(config_t&& other, Allocator const& alloc) config_t(
config_t&& other, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
Allocator const& alloc)
: KeyValueCompare(std::move(other.key_compare())) : KeyValueCompare(std::move(other.key_compare()))
, beast::detail::empty_base_optimization<ElementAllocator>(alloc) , beast::detail::empty_base_optimization<ElementAllocator>(alloc)
, clock(other.clock) , clock(other.clock)
@@ -552,7 +554,10 @@ public:
aged_ordered_container(aged_ordered_container&& other); aged_ordered_container(aged_ordered_container&& other);
aged_ordered_container(aged_ordered_container&& other, Allocator const& alloc); aged_ordered_container(
// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
aged_ordered_container&& other,
Allocator const& alloc);
aged_ordered_container(std::initializer_list<value_type> init, clock_type& clock); aged_ordered_container(std::initializer_list<value_type> init, clock_type& clock);
@@ -1290,7 +1295,7 @@ aged_ordered_container<IsMulti, IsMap, Key, T, Clock, Compare, Allocator>::aged_
template <bool IsMulti, bool IsMap, class Key, class T, class Clock, class Compare, class Allocator> template <bool IsMulti, bool IsMap, class Key, class T, class Clock, class Compare, class Allocator>
aged_ordered_container<IsMulti, IsMap, Key, T, Clock, Compare, Allocator>::aged_ordered_container( aged_ordered_container<IsMulti, IsMap, Key, T, Clock, Compare, Allocator>::aged_ordered_container(
aged_ordered_container&& other, aged_ordered_container&& other, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
Allocator const& alloc) Allocator const& alloc)
: m_config(std::move(other.m_config), alloc) : m_config(std::move(other.m_config), alloc)
#if BOOST_VERSION >= 108000 #if BOOST_VERSION >= 108000

View File

@@ -318,7 +318,9 @@ private:
{ {
} }
config_t(config_t&& other, Allocator const& alloc) config_t(
config_t&& other, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
Allocator const& alloc)
: ValueHash(std::move(other.hash_function())) : ValueHash(std::move(other.hash_function()))
, KeyValueEqual(std::move(other.key_eq())) , KeyValueEqual(std::move(other.key_eq()))
, beast::detail::empty_base_optimization<ElementAllocator>(alloc) , beast::detail::empty_base_optimization<ElementAllocator>(alloc)
@@ -774,7 +776,10 @@ public:
aged_unordered_container(aged_unordered_container&& other); aged_unordered_container(aged_unordered_container&& other);
aged_unordered_container(aged_unordered_container&& other, Allocator const& alloc); aged_unordered_container(
// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
aged_unordered_container&& other,
Allocator const& alloc);
aged_unordered_container(std::initializer_list<value_type> init, clock_type& clock); aged_unordered_container(std::initializer_list<value_type> init, clock_type& clock);
@@ -1838,7 +1843,10 @@ template <
class KeyEqual, class KeyEqual,
class Allocator> class Allocator>
aged_unordered_container<IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator>:: aged_unordered_container<IsMulti, IsMap, Key, T, Clock, Hash, KeyEqual, Allocator>::
aged_unordered_container(aged_unordered_container&& other, Allocator const& alloc) aged_unordered_container(
// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
aged_unordered_container&& other,
Allocator const& alloc)
: m_config(std::move(other.m_config), alloc) : m_config(std::move(other.m_config), alloc)
, m_buck(alloc) , m_buck(alloc)
, m_cont(m_buck, std::cref(m_config.value_hash()), std::cref(m_config.key_value_equal())) , m_cont(m_buck, std::cref(m_config.value_hash()), std::cref(m_config.key_value_equal()))

View File

@@ -449,7 +449,7 @@ public:
iterator iterator
erase(iterator pos) noexcept erase(iterator pos) noexcept
{ {
Node* node = &*pos; Node const* node = &*pos;
++pos; ++pos;
node->m_next->m_prev = node->m_prev; node->m_next->m_prev = node->m_prev;
node->m_prev->m_next = node->m_next; node->m_prev->m_next = node->m_next;

View File

@@ -187,7 +187,7 @@ public:
bool bool
push_front(Node* node) push_front(Node* node)
{ {
bool first; bool first = false;
Node* old_head = m_head.load(std::memory_order_relaxed); Node* old_head = m_head.load(std::memory_order_relaxed);
do do
{ {
@@ -211,7 +211,7 @@ public:
pop_front() pop_front()
{ {
Node* node = m_head.load(); Node* node = m_head.load();
Node* new_head; Node* new_head = nullptr;
do do
{ {
if (node == &m_end) if (node == &m_end)

View File

@@ -23,7 +23,7 @@ private:
// A 64-byte buffer should to be big enough for us // A 64-byte buffer should to be big enough for us
static constexpr std::size_t INTERNAL_BUFFER_SIZE = 64; static constexpr std::size_t INTERNAL_BUFFER_SIZE = 64;
alignas(64) std::array<std::uint8_t, INTERNAL_BUFFER_SIZE> buffer_; alignas(64) std::array<std::uint8_t, INTERNAL_BUFFER_SIZE> buffer_{};
std::span<std::uint8_t> readBuffer_; std::span<std::uint8_t> readBuffer_;
std::span<std::uint8_t> writeBuffer_; std::span<std::uint8_t> writeBuffer_;

View File

@@ -114,7 +114,7 @@ enable_yield_to::spawn(F0&& f, FN&&... fn)
boost::context::fixedsize_stack(2 * 1024 * 1024), boost::context::fixedsize_stack(2 * 1024 * 1024),
[&](yield_context yield) { [&](yield_context yield) {
f(yield); f(yield);
std::lock_guard lock{m_}; std::lock_guard const lock{m_};
if (--running_ == 0) if (--running_ == 0)
cv_.notify_all(); cv_.notify_all();
}, },

View File

@@ -35,10 +35,10 @@ private:
class tests_t : public detail::const_container<std::vector<test>> class tests_t : public detail::const_container<std::vector<test>>
{ {
private: private:
std::size_t failed_; std::size_t failed_{0};
public: public:
tests_t() : failed_(0) tests_t()
{ {
} }
@@ -167,12 +167,12 @@ public:
class results : public detail::const_container<std::vector<suite_results>> class results : public detail::const_container<std::vector<suite_results>>
{ {
private: private:
std::size_t m_cases; std::size_t m_cases{0};
std::size_t total_; std::size_t total_{0};
std::size_t failed_; std::size_t failed_{0};
public: public:
results() : m_cases(0), total_(0), failed_(0) results()
{ {
} }

View File

@@ -228,7 +228,7 @@ template <class>
void void
runner::testcase(std::string const& name) runner::testcase(std::string const& name)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
// Name may not be empty // Name may not be empty
BOOST_ASSERT(default_ || !name.empty()); BOOST_ASSERT(default_ || !name.empty());
// Forgot to call pass or fail // Forgot to call pass or fail
@@ -244,7 +244,7 @@ template <class>
void void
runner::pass() runner::pass()
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
if (default_) if (default_)
testcase(""); testcase("");
on_pass(); on_pass();
@@ -255,7 +255,7 @@ template <class>
void void
runner::fail(std::string const& reason) runner::fail(std::string const& reason)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
if (default_) if (default_)
testcase(""); testcase("");
on_fail(reason); on_fail(reason);
@@ -267,7 +267,7 @@ template <class>
void void
runner::log(std::string const& s) runner::log(std::string const& s)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
if (default_) if (default_)
testcase(""); testcase("");
on_log(s); on_log(s);

View File

@@ -300,7 +300,7 @@ private:
static suite** static suite**
p_this_suite() p_this_suite()
{ {
static suite* pts = nullptr; static suite* pts = nullptr; // NOLINT(misc-const-correctness)
return &pts; return &pts;
} }

View File

@@ -311,7 +311,7 @@ private:
std::string const m_name; std::string const m_name;
std::recursive_mutex lock_; std::recursive_mutex lock_;
Item item_; Item item_;
Source* parent_; Source* parent_{nullptr};
List<Item> children_; List<Item> children_;
public: public:

View File

@@ -28,7 +28,7 @@ struct Zero
namespace { namespace {
static constexpr Zero zero{}; static constexpr Zero zero{};
} } // namespace
/** Default implementation of signum calls the method on the class. */ /** Default implementation of signum calls the method on the class. */
template <typename T> template <typename T>

View File

@@ -37,7 +37,7 @@ public:
} }
private: private:
result_type s_[2]; result_type s_[2]{};
static result_type static result_type
murmurhash3(result_type x); murmurhash3(result_type x);

View File

@@ -56,7 +56,7 @@ private:
// a lock. This removes a small timing window that occurs if the // a lock. This removes a small timing window that occurs if the
// waiting thread is handling a spurious wakeup when closureCount_ // waiting thread is handling a spurious wakeup when closureCount_
// drops to zero. // drops to zero.
std::lock_guard lock{mutex_}; std::lock_guard const lock{mutex_};
// Update closureCount_. Notify if stopping and closureCount_ == 0. // Update closureCount_. Notify if stopping and closureCount_ == 0.
if ((--closureCount_ == 0) && waitForClosures_) if ((--closureCount_ == 0) && waitForClosures_)
@@ -92,7 +92,9 @@ private:
++counter_; ++counter_;
} }
Substitute(ClosureCounter& counter, Closure&& closure) Substitute(
ClosureCounter& counter,
Closure&& closure) // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
: counter_(counter), closure_(std::forward<Closure>(closure)) : counter_(counter), closure_(std::forward<Closure>(closure))
{ {
++counter_; ++counter_;
@@ -168,7 +170,7 @@ public:
{ {
std::optional<Substitute<Closure>> ret; std::optional<Substitute<Closure>> ret;
std::lock_guard lock{mutex_}; std::lock_guard const lock{mutex_};
if (!waitForClosures_) if (!waitForClosures_)
ret.emplace(*this, std::forward<Closure>(closure)); ret.emplace(*this, std::forward<Closure>(closure));
@@ -191,7 +193,7 @@ public:
bool bool
joined() const joined() const
{ {
std::lock_guard lock{mutex_}; std::lock_guard const lock{mutex_};
return waitForClosures_; return waitForClosures_;
} }
}; };

View File

@@ -7,7 +7,6 @@ JobQueue::Coro::Coro(Coro_create_t, JobQueue& jq, JobType type, std::string cons
: jq_(jq) : jq_(jq)
, type_(type) , type_(type)
, name_(name) , name_(name)
, running_(false)
, coro_( , coro_(
// Stack size of 1MB wasn't sufficient for deep calls. ASAN tests flagged the issue. Hence // Stack size of 1MB wasn't sufficient for deep calls. ASAN tests flagged the issue. Hence
// increasing the size to 1.5MB. // increasing the size to 1.5MB.
@@ -70,14 +69,24 @@ JobQueue::Coro::resume()
running_ = true; running_ = true;
} }
{ {
std::lock_guard lock(jq_.m_mutex); std::lock_guard lk(jq_.m_mutex);
--jq_.nSuspend_; --jq_.nSuspend_;
} }
auto saved = detail::getLocalValues().release(); auto saved = detail::getLocalValues().release();
detail::getLocalValues().reset(&lvs_); detail::getLocalValues().reset(&lvs_);
std::lock_guard lock(mutex_); std::lock_guard lock(mutex_);
XRPL_ASSERT(static_cast<bool>(coro_), "xrpl::JobQueue::Coro::resume : is runnable"); // A late resume() can arrive after the coroutine has already completed.
coro_(); // This is an expected (if rare) outcome of the race condition documented
// in JobQueue.h:354-377 where post() schedules a resume job before the
// coroutine yields — the mutex serializes access, but by the time this
// resume() acquires the lock the coroutine may have already run to
// completion. Calling operator() on a completed boost::coroutine2 is
// undefined behavior, so we must check and skip invoking the coroutine
// body if it has already completed.
if (coro_)
{
coro_();
}
detail::getLocalValues().release(); detail::getLocalValues().release();
detail::getLocalValues().reset(saved); detail::getLocalValues().reset(saved);
std::lock_guard lk(mutex_run_); std::lock_guard lk(mutex_run_);

View File

@@ -16,7 +16,7 @@ namespace xrpl {
namespace perf { namespace perf {
class PerfLog; class PerfLog;
} } // namespace perf
class Logs; class Logs;
struct Coro_create_t struct Coro_create_t
@@ -45,7 +45,7 @@ public:
JobQueue& jq_; JobQueue& jq_;
JobType type_; JobType type_;
std::string name_; std::string name_;
bool running_; bool running_{false};
std::mutex mutex_; std::mutex mutex_;
std::mutex mutex_run_; std::mutex mutex_run_;
std::condition_variable cv_; std::condition_variable cv_;
@@ -99,8 +99,8 @@ public:
Effects: Effects:
The coroutine continues execution from where it last left off The coroutine continues execution from where it last left off
using this same thread. using this same thread.
Undefined behavior if called after the coroutine has completed If the coroutine has already completed, returns immediately
with a return (as opposed to a yield()). (handles the documented post-before-yield race condition).
Undefined behavior if resume() or post() called consecutively Undefined behavior if resume() or post() called consecutively
without a corresponding yield. without a corresponding yield.
*/ */
@@ -224,7 +224,7 @@ private:
beast::Journal m_journal; beast::Journal m_journal;
mutable std::mutex m_mutex; mutable std::mutex m_mutex;
std::uint64_t m_lastJob; std::uint64_t m_lastJob{0};
std::set<Job> m_jobSet; std::set<Job> m_jobSet;
JobCounter jobCounter_; JobCounter jobCounter_;
std::atomic_bool stopping_{false}; std::atomic_bool stopping_{false};
@@ -233,7 +233,7 @@ private:
JobTypeData m_invalidJobData; JobTypeData m_invalidJobData;
// The number of jobs currently in processTask() // The number of jobs currently in processTask()
int m_processCount; int m_processCount{0};
// The number of suspended coroutines // The number of suspended coroutines
int nSuspend_ = 0; int nSuspend_ = 0;
@@ -357,8 +357,10 @@ private:
If the post() job were to be executed before yield(), undefined behavior If the post() job were to be executed before yield(), undefined behavior
would occur. The lock ensures that coro_ is not called again until we exit would occur. The lock ensures that coro_ is not called again until we exit
the coroutine. At which point a scheduled resume() job waiting on the lock the coroutine. At which point a scheduled resume() job waiting on the lock
would gain entry, harmlessly call coro_ and immediately return as we have would gain entry. resume() checks if the coroutine has already completed
already completed the coroutine. (coro_ converts to false) and, if so, skips invoking operator() since
calling operator() on a completed boost::coroutine2 pull_type is undefined
behavior.
The race condition occurs as follows: The race condition occurs as follows:

View File

@@ -19,13 +19,13 @@ public:
JobTypeInfo const& info; JobTypeInfo const& info;
/* The number of jobs waiting */ /* The number of jobs waiting */
int waiting; int waiting{0};
/* The number presently running */ /* The number presently running */
int running; int running{0};
/* And the number we deferred executing because of job limits */ /* And the number we deferred executing because of job limits */
int deferred; int deferred{0};
/* Notification callbacks */ /* Notification callbacks */
beast::insight::Event dequeue; beast::insight::Event dequeue;
@@ -35,12 +35,8 @@ public:
JobTypeInfo const& info_, JobTypeInfo const& info_,
beast::insight::Collector::ptr const& collector, beast::insight::Collector::ptr const& collector,
Logs& logs) noexcept Logs& logs) noexcept
: m_load(logs.journal("LoadMonitor")) : m_load(logs.journal("LoadMonitor")), m_collector(collector), info(info_)
, m_collector(collector)
, info(info_)
, waiting(0)
, running(0)
, deferred(0)
{ {
m_load.setTargetLatency(info.getAverageLatency(), info.getPeakLatency()); m_load.setTargetLatency(info.getAverageLatency(), info.getPeakLatency());

View File

@@ -24,7 +24,7 @@ private:
std::chrono::milliseconds{0}) std::chrono::milliseconds{0})
{ {
using namespace std::chrono_literals; using namespace std::chrono_literals;
int maxLimit = std::numeric_limits<int>::max(); int const maxLimit = std::numeric_limits<int>::max();
auto add = [this]( auto add = [this](
JobType jt, JobType jt,

View File

@@ -36,10 +36,10 @@ public:
{ {
Stats(); Stats();
std::uint64_t count; std::uint64_t count{0};
std::chrono::milliseconds latencyAvg; std::chrono::milliseconds latencyAvg;
std::chrono::milliseconds latencyPeak; std::chrono::milliseconds latencyPeak;
bool isOverloaded; bool isOverloaded{false};
}; };
Stats Stats
@@ -54,8 +54,8 @@ private:
std::mutex mutex_; std::mutex mutex_;
std::uint64_t mCounts; std::uint64_t mCounts{0};
int mLatencyEvents; int mLatencyEvents{0};
std::chrono::milliseconds mLatencyMSAvg; std::chrono::milliseconds mLatencyMSAvg;
std::chrono::milliseconds mLatencyMSPeak; std::chrono::milliseconds mLatencyMSPeak;
std::chrono::milliseconds mTargetLatencyAvg; std::chrono::milliseconds mTargetLatencyAvg;

View File

@@ -67,7 +67,7 @@ public:
bool bool
contains(PublicKey const& nodeId) contains(PublicKey const& nodeId)
{ {
std::lock_guard lock(this->mutex_); std::lock_guard const lock(this->mutex_);
return table_.find({nodeId}) != table_.end(); return table_.find({nodeId}) != table_.end();
} }
@@ -92,7 +92,7 @@ public:
private: private:
beast::Journal mutable journal_; beast::Journal mutable journal_;
std::mutex mutable mutex_; std::mutex mutable mutex_;
DatabaseCon* connection_; DatabaseCon* connection_{};
std::unordered_set<PeerReservation, beast::uhash<>, KeyEqual> table_; std::unordered_set<PeerReservation, beast::uhash<>, KeyEqual> table_;
}; };

View File

@@ -14,7 +14,7 @@
namespace beast { namespace beast {
class Journal; class Journal;
} } // namespace beast
namespace xrpl { namespace xrpl {
class Application; class Application;

View File

@@ -3,7 +3,6 @@
#include <xrpl/basics/Blob.h> #include <xrpl/basics/Blob.h>
#include <xrpl/basics/SHAMapHash.h> #include <xrpl/basics/SHAMapHash.h>
#include <xrpl/basics/TaggedCache.h> #include <xrpl/basics/TaggedCache.h>
#include <xrpl/ledger/CachedSLEs.h>
#include <boost/asio.hpp> #include <boost/asio.hpp>
@@ -12,17 +11,31 @@ namespace xrpl {
// Forward declarations // Forward declarations
namespace NodeStore { namespace NodeStore {
class Database; class Database;
} } // namespace NodeStore
namespace Resource { namespace Resource {
class Manager; class Manager;
} } // namespace Resource
namespace perf { namespace perf {
class PerfLog; class PerfLog;
} } // namespace perf
// This is temporary until we migrate all code to use ServiceRegistry. // This is temporary until we migrate all code to use ServiceRegistry.
class Application; class Application;
template <
class Key,
class T,
bool IsKeyCache,
class SharedWeakUnionPointer,
class SharedPointerType,
class Hash,
class KeyEqual,
class Mutex>
class TaggedCache;
class STLedgerEntry;
using SLE = STLedgerEntry;
using CachedSLEs = TaggedCache<uint256, SLE const>;
// Forward declarations // Forward declarations
class AcceptedLedger; class AcceptedLedger;
class AmendmentTable; class AmendmentTable;
@@ -89,7 +102,7 @@ public:
getNodeFamily() = 0; getNodeFamily() = 0;
virtual TimeKeeper& virtual TimeKeeper&
timeKeeper() = 0; getTimeKeeper() = 0;
virtual JobQueue& virtual JobQueue&
getJobQueue() = 0; getJobQueue() = 0;
@@ -98,7 +111,7 @@ public:
getTempNodeCache() = 0; getTempNodeCache() = 0;
virtual CachedSLEs& virtual CachedSLEs&
cachedSLEs() = 0; getCachedSLEs() = 0;
virtual NetworkIDService& virtual NetworkIDService&
getNetworkIDService() = 0; getNetworkIDService() = 0;
@@ -120,26 +133,26 @@ public:
getValidations() = 0; getValidations() = 0;
virtual ValidatorList& virtual ValidatorList&
validators() = 0; getValidators() = 0;
virtual ValidatorSite& virtual ValidatorSite&
validatorSites() = 0; getValidatorSites() = 0;
virtual ManifestCache& virtual ManifestCache&
validatorManifests() = 0; getValidatorManifests() = 0;
virtual ManifestCache& virtual ManifestCache&
publisherManifests() = 0; getPublisherManifests() = 0;
// Network services // Network services
virtual Overlay& virtual Overlay&
overlay() = 0; getOverlay() = 0;
virtual Cluster& virtual Cluster&
cluster() = 0; getCluster() = 0;
virtual PeerReservationTable& virtual PeerReservationTable&
peerReservations() = 0; getPeerReservations() = 0;
virtual Resource::Manager& virtual Resource::Manager&
getResourceManager() = 0; getResourceManager() = 0;
@@ -174,13 +187,13 @@ public:
getLedgerReplayer() = 0; getLedgerReplayer() = 0;
virtual PendingSaves& virtual PendingSaves&
pendingSaves() = 0; getPendingSaves() = 0;
virtual OpenLedger& virtual OpenLedger&
openLedger() = 0; getOpenLedger() = 0;
virtual OpenLedger const& virtual OpenLedger const&
openLedger() const = 0; getOpenLedger() const = 0;
// Transaction and operation services // Transaction and operation services
virtual NetworkOPs& virtual NetworkOPs&
@@ -210,16 +223,16 @@ public:
isStopping() const = 0; isStopping() const = 0;
virtual beast::Journal virtual beast::Journal
journal(std::string const& name) = 0; getJournal(std::string const& name) = 0;
virtual boost::asio::io_context& virtual boost::asio::io_context&
getIOContext() = 0; getIOContext() = 0;
virtual Logs& virtual Logs&
logs() = 0; getLogs() = 0;
virtual std::optional<uint256> const& virtual std::optional<uint256> const&
trapTxID() const = 0; getTrapTxID() const = 0;
/** Retrieve the "wallet database" */ /** Retrieve the "wallet database" */
virtual DatabaseCon& virtual DatabaseCon&
@@ -228,7 +241,7 @@ public:
// Temporary: Get the underlying Application for functions that haven't // Temporary: Get the underlying Application for functions that haven't
// been migrated yet. This should be removed once all code is migrated. // been migrated yet. This should be removed once all code is migrated.
virtual Application& virtual Application&
app() = 0; getApp() = 0;
}; };
} // namespace xrpl } // namespace xrpl

View File

@@ -5,7 +5,7 @@
namespace xrpl { namespace xrpl {
enum class StartUpType { FRESH, NORMAL, LOAD, LOAD_FILE, REPLAY, NETWORK }; enum class StartUpType { Fresh, Normal, Load, LoadFile, Replay, Network };
inline std::ostream& inline std::ostream&
operator<<(std::ostream& os, StartUpType const& type) operator<<(std::ostream& os, StartUpType const& type)

View File

@@ -13,7 +13,7 @@ namespace xrpl {
namespace perf { namespace perf {
class PerfLog; class PerfLog;
} } // namespace perf
/** /**
* `Workers` is effectively a thread pool. The constructor takes a "callback" * `Workers` is effectively a thread pool. The constructor takes a "callback"
@@ -183,8 +183,8 @@ private:
std::thread thread_; std::thread thread_;
std::mutex mutex_; std::mutex mutex_;
std::condition_variable wakeup_; std::condition_variable wakeup_;
int wakeCount_; // how many times to un-pause int wakeCount_{0}; // how many times to un-pause
bool shouldExit_; bool shouldExit_{false};
}; };
private: private:
@@ -197,9 +197,9 @@ private:
std::string m_threadNames; // The name to give each thread std::string m_threadNames; // The name to give each thread
std::condition_variable m_cv; // signaled when all threads paused std::condition_variable m_cv; // signaled when all threads paused
std::mutex m_mut; std::mutex m_mut;
bool m_allPaused; bool m_allPaused{true};
semaphore m_semaphore; // each pending task is 1 resource semaphore m_semaphore; // each pending task is 1 resource
int m_numberOfThreads; // how many we want active now int m_numberOfThreads{0}; // how many we want active now
std::atomic<int> m_activeCount; // to know when all are paused std::atomic<int> m_activeCount; // to know when all are paused
std::atomic<int> m_pauseCount; // how many threads need to pause now std::atomic<int> m_pauseCount; // how many threads need to pause now
std::atomic<int> m_runningTaskCount; // how many calls to processTask() active std::atomic<int> m_runningTaskCount; // how many calls to processTask() active

View File

@@ -55,7 +55,7 @@ public:
void void
notify() notify()
{ {
std::lock_guard lock{m_mutex}; std::lock_guard const lock{m_mutex};
++m_count; ++m_count;
m_cond.notify_one(); m_cond.notify_one();
} }

View File

@@ -103,9 +103,9 @@ private:
public: public:
explicit ErrorInfo() = default; explicit ErrorInfo() = default;
Token token_; Token token_{};
std::string message_; std::string message_;
Location extra_; Location extra_{};
}; };
using Errors = std::deque<ErrorInfo>; using Errors = std::deque<ErrorInfo>;
@@ -173,11 +173,11 @@ private:
Nodes nodes_; Nodes nodes_;
Errors errors_; Errors errors_;
std::string document_; std::string document_;
Location begin_; Location begin_{};
Location end_; Location end_{};
Location current_; Location current_{};
Location lastValueEnd_; Location lastValueEnd_{};
Value* lastValue_; Value* lastValue_{};
}; };
template <class BufferSequence> template <class BufferSequence>

View File

@@ -641,7 +641,7 @@ public:
SelfType SelfType
operator++(int) operator++(int)
{ {
SelfType temp(*this); SelfType const temp(*this);
++*this; ++*this;
return temp; return temp;
} }
@@ -649,7 +649,7 @@ public:
SelfType SelfType
operator--(int) operator--(int)
{ {
SelfType temp(*this); SelfType const temp(*this);
--*this; --*this;
return temp; return temp;
} }

View File

@@ -106,8 +106,8 @@ private:
ChildValues childValues_; ChildValues childValues_;
std::string document_; std::string document_;
std::string indentString_; std::string indentString_;
int rightMargin_; int rightMargin_{74};
int indentSize_; int indentSize_{3};
bool addChildValues_{}; bool addChildValues_{};
}; };
@@ -171,9 +171,9 @@ private:
using ChildValues = std::vector<std::string>; using ChildValues = std::vector<std::string>;
ChildValues childValues_; ChildValues childValues_;
std::ostream* document_; std::ostream* document_{nullptr};
std::string indentString_; std::string indentString_;
int rightMargin_; int rightMargin_{74};
std::string indentation_; std::string indentation_;
bool addChildValues_{}; bool addChildValues_{};
}; };

View File

@@ -143,7 +143,7 @@ public:
// Inject appropriate pseudo-transactions // Inject appropriate pseudo-transactions
for (auto const& it : actions) for (auto const& it : actions)
{ {
STTx amendTx(ttAMENDMENT, [&it, seq = lastClosedLedger->seq() + 1](auto& obj) { STTx const amendTx(ttAMENDMENT, [&it, seq = lastClosedLedger->seq() + 1](auto& obj) {
obj.setAccountID(sfAccount, AccountID()); obj.setAccountID(sfAccount, AccountID());
obj.setFieldH256(sfAmendment, it.first); obj.setFieldH256(sfAmendment, it.first);
obj.setFieldU32(sfLedgerSequence, seq); obj.setFieldU32(sfLedgerSequence, seq);

View File

@@ -6,4 +6,4 @@
namespace xrpl { namespace xrpl {
using CachedSLEs = TaggedCache<uint256, SLE const>; using CachedSLEs = TaggedCache<uint256, SLE const>;
} } // namespace xrpl

View File

@@ -76,16 +76,33 @@ public:
@return true if a book from this issue to XRP exists @return true if a book from this issue to XRP exists
*/ */
virtual bool virtual bool
isBookToXRP(Issue const& issue, std::optional<Domain> domain = std::nullopt) = 0; isBookToXRP(Issue const& issue, std::optional<Domain> const& domain = std::nullopt) = 0;
/**
* Process a transaction for order book tracking.
* @param ledger The ledger the transaction was applied to
* @param alTx The transaction to process
* @param jvObj The JSON object of the transaction
*/
virtual void virtual void
processTxn( processTxn(
std::shared_ptr<ReadView const> const& ledger, std::shared_ptr<ReadView const> const& ledger,
AcceptedLedgerTx const& alTx, AcceptedLedgerTx const& alTx,
MultiApiJson const& jvObj) = 0; MultiApiJson const& jvObj) = 0;
/**
* Get the book listeners for a book.
* @param book The book to get the listeners for
* @return The book listeners for the book
*/
virtual BookListeners::pointer virtual BookListeners::pointer
getBookListeners(Book const&) = 0; getBookListeners(Book const&) = 0;
/**
* Create a new book listeners for a book.
* @param book The book to create the listeners for
* @return The new book listeners for the book
*/
virtual BookListeners::pointer virtual BookListeners::pointer
makeBookListeners(Book const&) = 0; makeBookListeners(Book const&) = 0;
}; };

View File

@@ -31,7 +31,7 @@ public:
bool bool
startWork(LedgerIndex seq) startWork(LedgerIndex seq)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
auto it = map_.find(seq); auto it = map_.find(seq);
@@ -54,7 +54,7 @@ public:
void void
finishWork(LedgerIndex seq) finishWork(LedgerIndex seq)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
map_.erase(seq); map_.erase(seq);
await_.notify_all(); await_.notify_all();
@@ -64,7 +64,7 @@ public:
bool bool
pending(LedgerIndex seq) pending(LedgerIndex seq)
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
return map_.find(seq) != map_.end(); return map_.find(seq) != map_.end();
} }
@@ -117,7 +117,7 @@ public:
std::map<LedgerIndex, bool> std::map<LedgerIndex, bool>
getSnapshot() const getSnapshot() const
{ {
std::lock_guard lock(mutex_); std::lock_guard const lock(mutex_);
return map_; return map_;
} }

View File

@@ -16,7 +16,7 @@ struct FetchReport
{ {
} }
std::chrono::milliseconds elapsed; std::chrono::milliseconds elapsed{};
FetchType const fetchType; FetchType const fetchType;
bool wasFound = false; bool wasFound = false;
}; };

View File

@@ -71,8 +71,8 @@ private:
Scheduler& m_scheduler; Scheduler& m_scheduler;
LockType mWriteMutex; LockType mWriteMutex;
CondvarType mWriteCondition; CondvarType mWriteCondition;
int mWriteLoad; int mWriteLoad{0};
bool mWritePending; bool mWritePending{false};
Batch mWriteSet; Batch mWriteSet;
}; };

View File

@@ -35,7 +35,7 @@ namespace NodeStore {
class EncodedBlob class EncodedBlob
{ {
/** The 32-byte key of the serialized object. */ /** The 32-byte key of the serialized object. */
std::array<std::uint8_t, 32> key_; std::array<std::uint8_t, 32> key_{};
/** A pre-allocated buffer for the serialized object. /** A pre-allocated buffer for the serialized object.
@@ -43,7 +43,8 @@ class EncodedBlob
1024 more bytes. The precise size is calculated automatically 1024 more bytes. The precise size is calculated automatically
at compile time so as to avoid wasting space on padding bytes. at compile time so as to avoid wasting space on padding bytes.
*/ */
std::array<std::uint8_t, boost::alignment::align_up(9 + 1024, alignof(std::uint32_t))> payload_; std::array<std::uint8_t, boost::alignment::align_up(9 + 1024, alignof(std::uint32_t))>
payload_{};
/** The size of the serialized data. */ /** The size of the serialized data. */
std::uint32_t size_; std::uint32_t size_;

View File

@@ -56,7 +56,7 @@ lz4_compress(void const* in, std::size_t in_size, BufferFactory&& bf)
using std::runtime_error; using std::runtime_error;
using namespace nudb::detail; using namespace nudb::detail;
std::pair<void const*, std::size_t> result; std::pair<void const*, std::size_t> result;
std::array<std::uint8_t, varint_traits<std::size_t>::max> vi; std::array<std::uint8_t, varint_traits<std::size_t>::max> vi{};
auto const n = write_varint(vi.data(), in_size); auto const n = write_varint(vi.data(), in_size);
auto const out_max = LZ4_compressBound(in_size); auto const out_max = LZ4_compressBound(in_size);
std::uint8_t* out = reinterpret_cast<std::uint8_t*>(bf(n + out_max)); std::uint8_t* out = reinterpret_cast<std::uint8_t*>(bf(n + out_max));
@@ -88,7 +88,7 @@ nodeobject_decompress(void const* in, std::size_t in_size, BufferFactory&& bf)
using namespace nudb::detail; using namespace nudb::detail;
std::uint8_t const* p = reinterpret_cast<std::uint8_t const*>(in); std::uint8_t const* p = reinterpret_cast<std::uint8_t const*>(in);
std::size_t type; std::size_t type = 0;
auto const vn = read_varint(p, in_size, type); auto const vn = read_varint(p, in_size, type);
if (vn == 0) if (vn == 0)
Throw<std::runtime_error>("nodeobject decompress"); Throw<std::runtime_error>("nodeobject decompress");
@@ -117,7 +117,7 @@ nodeobject_decompress(void const* in, std::size_t in_size, BufferFactory&& bf)
"nodeobject codec v1: short inner node size: " + std::string("in_size = ") + "nodeobject codec v1: short inner node size: " + std::string("in_size = ") +
std::to_string(in_size) + " hs = " + std::to_string(hs)); std::to_string(in_size) + " hs = " + std::to_string(hs));
istream is(p, in_size); istream is(p, in_size);
std::uint16_t mask; std::uint16_t mask = 0;
read<std::uint16_t>(is, mask); // Mask read<std::uint16_t>(is, mask); // Mask
in_size -= hs; in_size -= hs;
result.second = 525; result.second = 525;
@@ -196,10 +196,10 @@ nodeobject_compress(void const* in, std::size_t in_size, BufferFactory&& bf)
if (in_size == 525) if (in_size == 525)
{ {
istream is(in, in_size); istream is(in, in_size);
std::uint32_t index; std::uint32_t index = 0;
std::uint32_t unused; std::uint32_t unused = 0;
std::uint8_t kind; std::uint8_t kind = 0;
std::uint32_t prefix; std::uint32_t prefix = 0;
read<std::uint32_t>(is, index); read<std::uint32_t>(is, index);
read<std::uint32_t>(is, unused); read<std::uint32_t>(is, unused);
read<std::uint8_t>(is, kind); read<std::uint8_t>(is, kind);
@@ -208,7 +208,7 @@ nodeobject_compress(void const* in, std::size_t in_size, BufferFactory&& bf)
{ {
std::size_t n = 0; std::size_t n = 0;
std::uint16_t mask = 0; std::uint16_t mask = 0;
std::array<std::uint8_t, 512> vh; std::array<std::uint8_t, 512> vh{};
for (unsigned bit = 0x8000; bit; bit >>= 1) for (unsigned bit = 0x8000; bit; bit >>= 1)
{ {
void const* const h = is(32); void const* const h = is(32);
@@ -247,7 +247,7 @@ nodeobject_compress(void const* in, std::size_t in_size, BufferFactory&& bf)
} }
} }
std::array<std::uint8_t, varint_traits<std::size_t>::max> vi; std::array<std::uint8_t, varint_traits<std::size_t>::max> vi{};
constexpr std::size_t codecType = 1; constexpr std::size_t codecType = 1;
auto const vn = write_varint(vi.data(), codecType); auto const vn = write_varint(vi.data(), codecType);
@@ -257,7 +257,7 @@ nodeobject_compress(void const* in, std::size_t in_size, BufferFactory&& bf)
// case 0 was uncompressed data; we always compress now. // case 0 was uncompressed data; we always compress now.
case 1: // lz4 case 1: // lz4
{ {
std::uint8_t* p; std::uint8_t* p = nullptr;
auto const lzr = NodeStore::lz4_compress(in, in_size, [&p, &vn, &bf](std::size_t n) { auto const lzr = NodeStore::lz4_compress(in, in_size, [&p, &vn, &bf](std::size_t n) {
p = reinterpret_cast<std::uint8_t*>(bf(vn + n)); p = reinterpret_cast<std::uint8_t*>(bf(vn + n));
return p + vn; return p + vn;
@@ -287,10 +287,10 @@ filter_inner(void* in, std::size_t in_size)
if (in_size == 525) if (in_size == 525)
{ {
istream is(in, in_size); istream is(in, in_size);
std::uint32_t index; std::uint32_t index = 0;
std::uint32_t unused; std::uint32_t unused = 0;
std::uint8_t kind; std::uint8_t kind = 0;
std::uint32_t prefix; std::uint32_t prefix = 0;
read<std::uint32_t>(is, index); read<std::uint32_t>(is, index);
read<std::uint32_t>(is, unused); read<std::uint32_t>(is, unused);
read<std::uint8_t>(is, kind); read<std::uint8_t>(is, kind);

View File

@@ -82,6 +82,7 @@ template <class = void>
std::size_t std::size_t
write_varint(void* p0, std::size_t v) write_varint(void* p0, std::size_t v)
{ {
// NOLINTNEXTLINE(misc-const-correctness)
std::uint8_t* p = reinterpret_cast<std::uint8_t*>(p0); std::uint8_t* p = reinterpret_cast<std::uint8_t*>(p0);
do do
{ {

View File

@@ -102,7 +102,7 @@ template <typename T>
T T
toAmount(Issue const& issue, Number const& n, Number::rounding_mode mode = Number::getround()) toAmount(Issue const& issue, Number const& n, Number::rounding_mode mode = Number::getround())
{ {
saveNumberRoundMode rm(Number::getround()); saveNumberRoundMode const rm(Number::getround());
if (isXRP(issue)) if (isXRP(issue))
Number::setround(mode); Number::setround(mode);

View File

@@ -26,8 +26,8 @@ class IOUAmount : private boost::totally_ordered<IOUAmount>, private boost::addi
private: private:
using mantissa_type = std::int64_t; using mantissa_type = std::int64_t;
using exponent_type = int; using exponent_type = int;
mantissa_type mantissa_; mantissa_type mantissa_{};
exponent_type exponent_; exponent_type exponent_{};
/** Adjusts the mantissa and exponent to the proper range. /** Adjusts the mantissa and exponent to the proper range.

View File

@@ -363,11 +363,12 @@ uint256
getTicketIndex(AccountID const& account, SeqProxy ticketSeq); getTicketIndex(AccountID const& account, SeqProxy ticketSeq);
template <class... keyletParams> template <class... keyletParams>
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
struct keyletDesc struct keyletDesc
{ {
std::function<Keylet(keyletParams...)> function; std::function<Keylet(keyletParams...)> function;
Json::StaticString expectedLEName; Json::StaticString expectedLEName;
bool includeInTests; bool includeInTests{};
}; };
// This list should include all of the keylet functions that take a single // This list should include all of the keylet functions that take a single

View File

@@ -96,7 +96,7 @@ operator<=>(Issue const& lhs, Issue const& rhs)
inline Issue const& inline Issue const&
xrpIssue() xrpIssue()
{ {
static Issue issue{xrpCurrency(), xrpAccount()}; static Issue const issue{xrpCurrency(), xrpAccount()};
return issue; return issue;
} }
@@ -104,7 +104,7 @@ xrpIssue()
inline Issue const& inline Issue const&
noIssue() noIssue()
{ {
static Issue issue{noCurrency(), noAccount()}; static Issue const issue{noCurrency(), noAccount()};
return issue; return issue;
} }

View File

@@ -56,8 +56,8 @@ struct TAmounts
return *this; return *this;
} }
In in; In in{};
Out out; Out out{};
}; };
using Amounts = TAmounts<STAmount, STAmount>; using Amounts = TAmounts<STAmount, STAmount>;
@@ -304,8 +304,8 @@ Quality::ceil_TAmounts_helper(
// Use the existing STAmount implementation for now, but consider // Use the existing STAmount implementation for now, but consider
// replacing with code specific to IOUAMount and XRPAmount // replacing with code specific to IOUAMount and XRPAmount
Amounts stAmt(toSTAmount(amount.in), toSTAmount(amount.out)); Amounts const stAmt(toSTAmount(amount.in), toSTAmount(amount.out));
STAmount stLim(toSTAmount(limit)); STAmount const stLim(toSTAmount(limit));
Amounts const stRes = ((*this).*ceil_function)(stAmt, stLim, roundUp...); Amounts const stRes = ((*this).*ceil_function)(stAmt, stLim, roundUp...);
return TAmounts<In, Out>(toAmount<In>(stRes.in), toAmount<Out>(stRes.out)); return TAmounts<In, Out>(toAmount<In>(stRes.in), toAmount<Out>(stRes.out));
} }

View File

@@ -6,4 +6,4 @@ namespace xrpl {
using LedgerHash = uint256; using LedgerHash = uint256;
} } // namespace xrpl

View File

@@ -35,9 +35,9 @@ public:
private: private:
Asset mAsset; Asset mAsset;
mantissa_type mValue; mantissa_type mValue{};
exponent_type mOffset; exponent_type mOffset;
bool mIsNegative; bool mIsNegative{};
public: public:
using value_type = STAmount; using value_type = STAmount;
@@ -532,7 +532,7 @@ STAmount::fromNumber(A const& a, Number const& number)
{ {
bool const negative = number.mantissa() < 0; bool const negative = number.mantissa() < 0;
Number const working{negative ? -number : number}; Number const working{negative ? -number : number};
Asset asset{a}; Asset const asset{a};
if (asset.integral()) if (asset.integral())
{ {
std::uint64_t const intValue = static_cast<std::int64_t>(working); std::uint64_t const intValue = static_cast<std::int64_t>(working);
@@ -716,7 +716,7 @@ roundToAsset(
std::int32_t scale, std::int32_t scale,
Number::rounding_mode rounding = Number::getround()) Number::rounding_mode rounding = Number::getround())
{ {
NumberRoundModeGuard mg(rounding); NumberRoundModeGuard const mg(rounding);
STAmount const ret{asset, value}; STAmount const ret{asset, value};
if (ret.integral()) if (ret.integral())
return ret; return ret;

View File

@@ -83,7 +83,7 @@ to_json(T const& t)
namespace detail { namespace detail {
class STVar; class STVar;
} } // namespace detail
// VFALCO TODO fix this restriction on copy assignment. // VFALCO TODO fix this restriction on copy assignment.
// //

View File

@@ -8,7 +8,7 @@ namespace xrpl {
class Rules; class Rules;
namespace test { namespace test {
class Invariants_test; class Invariants_test;
} } // namespace test
class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry> class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry>
{ {
@@ -86,7 +86,9 @@ inline STLedgerEntry::STLedgerEntry(LedgerEntryType type, uint256 const& key)
{ {
} }
inline STLedgerEntry::STLedgerEntry(SerialIter&& sit, uint256 const& index) inline STLedgerEntry::STLedgerEntry(
SerialIter&& sit, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
uint256 const& index)
: STLedgerEntry(sit, index) : STLedgerEntry(sit, index)
{ {
} }

View File

@@ -671,7 +671,7 @@ public:
OptionalProxy& OptionalProxy&
operator=(std::nullopt_t const&); operator=(std::nullopt_t const&);
OptionalProxy& OptionalProxy&
operator=(optional_type&& v); operator=(optional_type&& v); // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
OptionalProxy& OptionalProxy&
operator=(optional_type const& v); operator=(optional_type const& v);
@@ -766,7 +766,7 @@ STObject::Proxy<T>::assign(U&& u)
st_->makeFieldAbsent(*f_); st_->makeFieldAbsent(*f_);
return; return;
} }
T* t; T* t = nullptr;
if (style_ == soeINVALID) if (style_ == soeINVALID)
t = dynamic_cast<T*>(st_->getPField(*f_, true)); t = dynamic_cast<T*>(st_->getPField(*f_, true));
else else
@@ -851,7 +851,9 @@ STObject::OptionalProxy<T>::operator=(std::nullopt_t const&) -> OptionalProxy&
template <class T> template <class T>
auto auto
STObject::OptionalProxy<T>::operator=(optional_type&& v) -> OptionalProxy& STObject::OptionalProxy<T>::operator=(
optional_type&& v) // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
-> OptionalProxy&
{ {
if (v) if (v)
this->assign(std::move(*v)); this->assign(std::move(*v));
@@ -930,6 +932,7 @@ STObject::Transform::operator()(detail::STVar const& e) const
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
inline STObject::STObject(SerialIter&& sit, SField const& name) : STObject(sit, name) inline STObject::STObject(SerialIter&& sit, SField const& name) : STObject(sit, name)
{ {
} }
@@ -1153,7 +1156,7 @@ STObject::getFieldByValue(SField const& field) const
if (!rf) if (!rf)
throwFieldNotFound(field); throwFieldNotFound(field);
SerializedTypeID id = rf->getSType(); SerializedTypeID const id = rf->getSType();
if (id == STI_NOTPRESENT) if (id == STI_NOTPRESENT)
return V(); // optional field not present return V(); // optional field not present
@@ -1180,7 +1183,7 @@ STObject::getFieldByConstRef(SField const& field, V const& empty) const
if (!rf) if (!rf)
throwFieldNotFound(field); throwFieldNotFound(field);
SerializedTypeID id = rf->getSType(); SerializedTypeID const id = rf->getSType();
if (id == STI_NOTPRESENT) if (id == STI_NOTPRESENT)
return empty; // optional field not present return empty; // optional field not present

View File

@@ -179,7 +179,8 @@ sterilize(STTx const& stx);
bool bool
isPseudoTx(STObject const& tx); isPseudoTx(STObject const& tx);
inline STTx::STTx(SerialIter&& sit) : STTx(sit) inline STTx::STTx(SerialIter&& sit) // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
: STTx(sit)
{ {
} }

View File

@@ -69,9 +69,6 @@ public:
std::vector<uint256>::iterator std::vector<uint256>::iterator
insert(std::vector<uint256>::const_iterator pos, uint256 const& value); insert(std::vector<uint256>::const_iterator pos, uint256 const& value);
std::vector<uint256>::iterator
insert(std::vector<uint256>::const_iterator pos, uint256&& value);
void void
push_back(uint256 const& v); push_back(uint256 const& v);
@@ -184,12 +181,6 @@ STVector256::insert(std::vector<uint256>::const_iterator pos, uint256 const& val
return mValue.insert(pos, value); return mValue.insert(pos, value);
} }
inline std::vector<uint256>::iterator
STVector256::insert(std::vector<uint256>::const_iterator pos, uint256&& value)
{
return mValue.insert(pos, std::move(value));
}
inline void inline void
STVector256::push_back(uint256 const& v) STVector256::push_back(uint256 const& v)
{ {

View File

@@ -69,7 +69,7 @@ public:
int int
add32(T i) add32(T i)
{ {
int ret = mData.size(); int const ret = mData.size();
mData.push_back(static_cast<unsigned char>((i >> 24) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 24) & 0xff));
mData.push_back(static_cast<unsigned char>((i >> 16) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 16) & 0xff));
mData.push_back(static_cast<unsigned char>((i >> 8) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 8) & 0xff));
@@ -85,7 +85,7 @@ public:
int int
add64(T i) add64(T i)
{ {
int ret = mData.size(); int const ret = mData.size();
mData.push_back(static_cast<unsigned char>((i >> 56) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 56) & 0xff));
mData.push_back(static_cast<unsigned char>((i >> 48) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 48) & 0xff));
mData.push_back(static_cast<unsigned char>((i >> 40) & 0xff)); mData.push_back(static_cast<unsigned char>((i >> 40) & 0xff));
@@ -299,7 +299,7 @@ template <class Iter>
int int
Serializer::addVL(Iter begin, Iter end, int len) Serializer::addVL(Iter begin, Iter end, int len)
{ {
int ret = addEncoded(len); int const ret = addEncoded(len);
for (; begin != end; ++begin) for (; begin != end; ++begin)
{ {
addRaw(begin->data(), begin->size()); addRaw(begin->data(), begin->size());

View File

@@ -2,6 +2,6 @@
namespace xrpl { namespace xrpl {
enum class TxSearched { all, some, unknown }; enum class TxSearched { All, Some, Unknown };
} } // namespace xrpl

View File

@@ -25,16 +25,10 @@ extern nonPresentObject_t nonPresentObject;
// Concept to constrain STVar constructors, which // Concept to constrain STVar constructors, which
// instantiate ST* types from SerializedTypeID // instantiate ST* types from SerializedTypeID
// clang-format off
template <typename... Args> template <typename... Args>
concept ValidConstructSTArgs = concept ValidConstructSTArgs =
(std::is_same_v< (std::is_same_v<std::tuple<std::remove_cvref_t<Args>...>, std::tuple<SField>> ||
std::tuple<std::remove_cvref_t<Args>...>, std::is_same_v<std::tuple<std::remove_cvref_t<Args>...>, std::tuple<SerialIter, SField>>);
std::tuple<SField>> ||
std::is_same_v<
std::tuple<std::remove_cvref_t<Args>...>,
std::tuple<SerialIter, SField>>);
// clang-format on
// "variant" that can hold any type of serialized object // "variant" that can hold any type of serialized object
// and includes a small-object allocation optimization. // and includes a small-object allocation optimization.
@@ -56,7 +50,7 @@ public:
STVar& STVar&
operator=(STVar&& rhs); operator=(STVar&& rhs);
STVar(STBase&& t) STVar(STBase&& t) // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
{ {
p_ = t.move(max_size, &d_); p_ = t.move(max_size, &d_);
} }

View File

@@ -59,7 +59,7 @@ inplace_bigint_add(std::span<std::uint64_t> a, std::uint64_t b)
return TokenCodecErrc::inputTooSmall; return TokenCodecErrc::inputTooSmall;
} }
std::uint64_t carry; std::uint64_t carry = 0;
std::tie(a[0], carry) = carrying_add(a[0], b); std::tie(a[0], carry) = carrying_add(a[0], b);
for (auto& v : a.subspan(1)) for (auto& v : a.subspan(1))
@@ -162,7 +162,7 @@ b58_10_to_b58_be(std::uint64_t input)
int i = 0; int i = 0;
while (input > 0) while (input > 0)
{ {
std::uint64_t rem; std::uint64_t rem = 0;
std::tie(input, rem) = div_rem(input, 58); std::tie(input, rem) = div_rem(input, 58);
result[resultSize - 1 - i] = rem; result[resultSize - 1 - i] = rem;
i += 1; i += 1;

View File

@@ -11,66 +11,65 @@
#error "undefined macro: XRPL_RETIRE_FIX" #error "undefined macro: XRPL_RETIRE_FIX"
#endif #endif
// clang-format off
// Add new amendments to the top of this list. // Add new amendments to the top of this list.
// Keep it sorted in reverse chronological order. // Keep it sorted in reverse chronological order.
XRPL_FIX (Security3_1_3, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (Security3_1_3, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (PermissionedDomainInvariant, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (PermissionedDomainInvariant, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (ExpiredNFTokenOfferRemoval, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (ExpiredNFTokenOfferRemoval, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (BatchInnerSigs, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (BatchInnerSigs, Supported::no, VoteBehavior::DefaultNo)
XRPL_FEATURE(LendingProtocol, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(LendingProtocol, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(PermissionDelegationV1_1, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(PermissionDelegationV1_1, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (IncludeKeyletFields, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (IncludeKeyletFields, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DynamicMPT, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(DynamicMPT, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (TokenEscrowV1, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (TokenEscrowV1, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (PriceOracleOrder, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (PriceOracleOrder, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (MPTDeliveredAmount, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (MPTDeliveredAmount, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (AMMClawbackRounding, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (AMMClawbackRounding, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(TokenEscrow, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(TokenEscrow, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (EnforceNFTokenTrustlineV2, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (EnforceNFTokenTrustlineV2, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (AMMv1_3, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (AMMv1_3, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(PermissionedDEX, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(PermissionedDEX, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(Batch, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(Batch, Supported::no, VoteBehavior::DefaultNo)
XRPL_FEATURE(SingleAssetVault, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(SingleAssetVault, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (PayChanCancelAfter, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (PayChanCancelAfter, Supported::yes, VoteBehavior::DefaultNo)
// Check flags in Credential transactions // Check flags in Credential transactions
XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(PermissionedDomains, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(PermissionedDomains, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DynamicNFT, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DynamicNFT, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(Credentials, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(Credentials, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(AMMClawback, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(AMMClawback, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (AMMv1_2, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (AMMv1_2, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(MPTokensV1, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(MPTokensV1, Supported::yes, VoteBehavior::DefaultNo)
// InvariantsV1_1 will be changes to Supported::yes when all the // InvariantsV1_1 will be changed to Supported::yes when all the invariants expected to be included
// invariants expected to be included under it are complete. // under it are complete.
XRPL_FEATURE(InvariantsV1_1, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(InvariantsV1_1, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (NFTokenPageLinks, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (NFTokenPageLinks, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (InnerObjTemplate2, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InnerObjTemplate2, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (EnforceNFTokenTrustline, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (EnforceNFTokenTrustline, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (ReducedOffersV2, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (ReducedOffersV2, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(NFTokenMintOffer, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(NFTokenMintOffer, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (AMMv1_1, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (AMMv1_1, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (PreviousTxnID, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (PreviousTxnID, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (XChainRewardRounding, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (XChainRewardRounding, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (EmptyDID, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (EmptyDID, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(PriceOracle, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(PriceOracle, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (AMMOverflowOffer, Supported::yes, VoteBehavior::DefaultYes) XRPL_FIX (AMMOverflowOffer, Supported::yes, VoteBehavior::DefaultYes)
XRPL_FIX (InnerObjTemplate, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InnerObjTemplate, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (NFTokenReserve, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (NFTokenReserve, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (FillOrKill, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (FillOrKill, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DID, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DID, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (DisallowIncomingV1, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (DisallowIncomingV1, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(XChainBridge, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(XChainBridge, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(AMM, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(AMM, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(Clawback, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(Clawback, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (UniversalNumber, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (UniversalNumber, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(XRPFees, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(XRPFees, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (RemoveNFTokenAutoTrustLine, Supported::yes, VoteBehavior::DefaultYes) XRPL_FIX (RemoveNFTokenAutoTrustLine, Supported::yes, VoteBehavior::DefaultYes)
// The following amendments are obsolete, but must remain supported // The following amendments are obsolete, but must remain supported
// because they could potentially get enabled. // because they could potentially get enabled.
@@ -144,5 +143,3 @@ XRPL_RETIRE_FEATURE(SortedDirectories)
XRPL_RETIRE_FEATURE(TicketBatch) XRPL_RETIRE_FEATURE(TicketBatch)
XRPL_RETIRE_FEATURE(TickSize) XRPL_RETIRE_FEATURE(TickSize)
XRPL_RETIRE_FEATURE(TrustSetAuth) XRPL_RETIRE_FEATURE(TrustSetAuth)
// clang-format on

View File

@@ -5,7 +5,6 @@
#error "undefined macro: TYPED_SFIELD" #error "undefined macro: TYPED_SFIELD"
#endif #endif
// clang-format off
// untyped // untyped
UNTYPED_SFIELD(sfLedgerEntry, LEDGERENTRY, 257) UNTYPED_SFIELD(sfLedgerEntry, LEDGERENTRY, 257)
@@ -421,5 +420,3 @@ UNTYPED_SFIELD(sfAcceptedCredentials, ARRAY, 28)
UNTYPED_SFIELD(sfPermissions, ARRAY, 29) UNTYPED_SFIELD(sfPermissions, ARRAY, 29)
UNTYPED_SFIELD(sfRawTransactions, ARRAY, 30) UNTYPED_SFIELD(sfRawTransactions, ARRAY, 30)
UNTYPED_SFIELD(sfBatchSigners, ARRAY, 31, SField::sMD_Default, SField::notSigning) UNTYPED_SFIELD(sfBatchSigners, ARRAY, 31, SField::sMD_Default, SField::notSigning)
// clang-format on

View File

@@ -15,7 +15,7 @@ enum class TokenCodecErrc {
overflowAdd, overflowAdd,
unknown, unknown,
}; };
} } // namespace xrpl
namespace std { namespace std {
template <> template <>
@@ -69,7 +69,7 @@ public:
inline xrpl::detail::TokenCodecErrcCategory const& inline xrpl::detail::TokenCodecErrcCategory const&
TokenCodecErrcCategory() TokenCodecErrcCategory()
{ {
static xrpl::detail::TokenCodecErrcCategory c; static xrpl::detail::TokenCodecErrcCategory const c;
return c; return c;
} }

View File

@@ -112,7 +112,7 @@ getOrThrow(Json::Value const& v, xrpl::SField const& field)
{ {
auto const s = inner.asString(); auto const s = inner.asString();
// parse as hex // parse as hex
std::uint64_t val; std::uint64_t val = 0;
auto [p, ec] = std::from_chars(s.data(), s.data() + s.size(), val, 16); auto [p, ec] = std::from_chars(s.data(), s.data() + s.size(), val, 16);

File diff suppressed because it is too large Load Diff

View File

@@ -39,7 +39,7 @@ constexpr std::uint16_t const flagMutable = 0x0010;
inline std::uint16_t inline std::uint16_t
getFlags(uint256 const& id) getFlags(uint256 const& id)
{ {
std::uint16_t flags; std::uint16_t flags = 0;
memcpy(&flags, id.begin(), 2); memcpy(&flags, id.begin(), 2);
return boost::endian::big_to_native(flags); return boost::endian::big_to_native(flags);
} }
@@ -47,7 +47,7 @@ getFlags(uint256 const& id)
inline std::uint16_t inline std::uint16_t
getTransferFee(uint256 const& id) getTransferFee(uint256 const& id)
{ {
std::uint16_t fee; std::uint16_t fee = 0;
memcpy(&fee, id.begin() + 2, 2); memcpy(&fee, id.begin() + 2, 2);
return boost::endian::big_to_native(fee); return boost::endian::big_to_native(fee);
} }
@@ -55,7 +55,7 @@ getTransferFee(uint256 const& id)
inline std::uint32_t inline std::uint32_t
getSerial(uint256 const& id) getSerial(uint256 const& id)
{ {
std::uint32_t seq; std::uint32_t seq = 0;
memcpy(&seq, id.begin() + 28, 4); memcpy(&seq, id.begin() + 28, 4);
return boost::endian::big_to_native(seq); return boost::endian::big_to_native(seq);
} }
@@ -87,7 +87,7 @@ cipheredTaxon(std::uint32_t tokenSeq, Taxon taxon)
inline Taxon inline Taxon
getTaxon(uint256 const& id) getTaxon(uint256 const& id)
{ {
std::uint32_t taxon; std::uint32_t taxon = 0;
memcpy(&taxon, id.begin() + 24, 4); memcpy(&taxon, id.begin() + 24, 4);
taxon = boost::endian::big_to_native(taxon); taxon = boost::endian::big_to_native(taxon);

View File

@@ -0,0 +1,3 @@
# This disables all checks for this directory and its subdirectories
Checks: "-*"
InheritParentConfig: false

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <xrpl/core/PerfLog.h> #include <xrpl/core/PerfLog.h>
#include <xrpl/core/ServiceRegistry.h>
#include <xrpl/core/StartUpType.h> #include <xrpl/core/StartUpType.h>
#include <xrpl/rdb/DBInit.h> #include <xrpl/rdb/DBInit.h>
#include <xrpl/rdb/SociDB.h> #include <xrpl/rdb/SociDB.h>
@@ -13,7 +14,7 @@
namespace soci { namespace soci {
class session; class session;
} } // namespace soci
namespace xrpl { namespace xrpl {
@@ -69,7 +70,7 @@ public:
{ {
explicit Setup() = default; explicit Setup() = default;
StartUpType startUp = StartUpType::NORMAL; StartUpType startUp = StartUpType::Normal;
bool standAlone = false; bool standAlone = false;
boost::filesystem::path dataDir; boost::filesystem::path dataDir;
// Indicates whether or not to return the `globalPragma` // Indicates whether or not to return the `globalPragma`
@@ -94,7 +95,7 @@ public:
struct CheckpointerSetup struct CheckpointerSetup
{ {
JobQueue* jobQueue; JobQueue* jobQueue;
Logs* logs; std::reference_wrapper<ServiceRegistry> registry;
}; };
template <std::size_t N, std::size_t M> template <std::size_t N, std::size_t M>
@@ -106,9 +107,8 @@ public:
beast::Journal journal) beast::Journal journal)
// Use temporary files or regular DB files? // Use temporary files or regular DB files?
: DatabaseCon( : DatabaseCon(
setup.standAlone && setup.startUp != StartUpType::LOAD && setup.standAlone && setup.startUp != StartUpType::Load &&
setup.startUp != StartUpType::LOAD_FILE && setup.startUp != StartUpType::LoadFile && setup.startUp != StartUpType::Replay
setup.startUp != StartUpType::REPLAY
? "" ? ""
: (setup.dataDir / dbName), : (setup.dataDir / dbName),
setup.commonPragma(), setup.commonPragma(),
@@ -129,7 +129,7 @@ public:
beast::Journal journal) beast::Journal journal)
: DatabaseCon(setup, dbName, pragma, initSQL, journal) : DatabaseCon(setup, dbName, pragma, initSQL, journal)
{ {
setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs); setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
} }
template <std::size_t N, std::size_t M> template <std::size_t N, std::size_t M>
@@ -154,7 +154,7 @@ public:
beast::Journal journal) beast::Journal journal)
: DatabaseCon(dataDir, dbName, pragma, initSQL, journal) : DatabaseCon(dataDir, dbName, pragma, initSQL, journal)
{ {
setupCheckpointing(checkpointerSetup.jobQueue, *checkpointerSetup.logs); setupCheckpointing(checkpointerSetup.jobQueue, checkpointerSetup.registry.get());
} }
~DatabaseCon(); ~DatabaseCon();
@@ -177,7 +177,7 @@ public:
private: private:
void void
setupCheckpointing(JobQueue*, Logs&); setupCheckpointing(JobQueue*, ServiceRegistry&);
template <std::size_t N, std::size_t M> template <std::size_t N, std::size_t M>
DatabaseCon( DatabaseCon(

View File

@@ -49,21 +49,21 @@ public:
struct AccountTxOptions struct AccountTxOptions
{ {
AccountID const& account; AccountID const& account;
std::uint32_t minLedger; /// Ledger sequence range to search. A value of 0 for min or max
std::uint32_t maxLedger; /// means unbounded in that direction (no constraint applied).
std::uint32_t offset; LedgerRange ledgerRange{};
std::uint32_t limit; std::uint32_t offset = 0;
bool bUnlimited; std::uint32_t limit = 0;
bool bUnlimited{};
}; };
struct AccountTxPageOptions struct AccountTxPageOptions
{ {
AccountID const& account; AccountID const& account;
std::uint32_t minLedger; LedgerRange ledgerRange{};
std::uint32_t maxLedger;
std::optional<AccountTxMarker> marker; std::optional<AccountTxMarker> marker;
std::uint32_t limit; std::uint32_t limit = 0;
bool bAdmin; bool bAdmin = false;
}; };
using AccountTx = std::pair<std::shared_ptr<Transaction>, std::shared_ptr<TxMeta>>; using AccountTx = std::pair<std::shared_ptr<Transaction>, std::shared_ptr<TxMeta>>;
@@ -88,8 +88,8 @@ public:
struct AccountTxResult struct AccountTxResult
{ {
std::variant<AccountTxs, MetaTxsList> transactions; std::variant<AccountTxs, MetaTxsList> transactions;
LedgerRange ledgerRange; LedgerRange ledgerRange{};
uint32_t limit; uint32_t limit = 0;
std::optional<AccountTxMarker> marker; std::optional<AccountTxMarker> marker;
}; };
@@ -247,7 +247,7 @@ public:
* @return Struct CountMinMax which contains the minimum sequence, * @return Struct CountMinMax which contains the minimum sequence,
* maximum sequence and number of ledgers. * maximum sequence and number of ledgers.
*/ */
virtual struct CountMinMax virtual CountMinMax
getLedgerCountMinMax() = 0; getLedgerCountMinMax() = 0;
/** /**
@@ -405,10 +405,10 @@ public:
* @param id Hash of the transaction. * @param id Hash of the transaction.
* @param range Range of ledgers to check, if present. * @param range Range of ledgers to check, if present.
* @param ec Default error code value. * @param ec Default error code value.
* @return Transaction and its metadata if found, otherwise TxSearched::all * @return Transaction and its metadata if found, otherwise TxSearched::All
* if a range is provided and all ledgers from the range are present * if a range is provided and all ledgers from the range are present
* in the database, TxSearched::some if a range is provided and not * in the database, TxSearched::Some if a range is provided and not
* all ledgers are present, TxSearched::unknown if the range is not * all ledgers are present, TxSearched::Unknown if the range is not
* provided or a deserializing error occurred. In the last case the * provided or a deserializing error occurred. In the last case the
* error code is returned via the ec parameter, in other cases the * error code is returned via the ec parameter, in other cases the
* default error code is not changed. * default error code is not changed.
@@ -455,9 +455,10 @@ public:
closeTransactionDB() = 0; closeTransactionDB() = 0;
}; };
template <class T, class C> template <typename T, typename C>
T T
rangeCheckedCast(C c) rangeCheckedCast(C c)
requires(std::is_arithmetic_v<T> && std::is_arithmetic_v<C> && std::convertible_to<C, T>)
{ {
if ((c > std::numeric_limits<T>::max()) || (!std::numeric_limits<T>::is_signed && c < 0) || if ((c > std::numeric_limits<T>::max()) || (!std::numeric_limits<T>::is_signed && c < 0) ||
(std::numeric_limits<T>::is_signed && std::numeric_limits<C>::is_signed && (std::numeric_limits<T>::is_signed && std::numeric_limits<C>::is_signed &&

View File

@@ -13,8 +13,8 @@
#pragma clang diagnostic ignored "-Wdeprecated" #pragma clang diagnostic ignored "-Wdeprecated"
#endif #endif
#include <xrpl/basics/Log.h>
#include <xrpl/core/JobQueue.h> #include <xrpl/core/JobQueue.h>
#include <xrpl/core/ServiceRegistry.h>
#define SOCI_USE_BOOST #define SOCI_USE_BOOST
#include <soci/soci.h> #include <soci/soci.h>
@@ -25,7 +25,7 @@
namespace sqlite_api { namespace sqlite_api {
struct sqlite3; struct sqlite3;
} } // namespace sqlite_api
namespace xrpl { namespace xrpl {
@@ -111,7 +111,7 @@ public:
and so must outlive them both. and so must outlive them both.
*/ */
std::shared_ptr<Checkpointer> std::shared_ptr<Checkpointer>
makeCheckpointer(std::uintptr_t id, std::weak_ptr<soci::session>, JobQueue&, Logs&); makeCheckpointer(std::uintptr_t id, std::weak_ptr<soci::session>, JobQueue&, ServiceRegistry&);
} // namespace xrpl } // namespace xrpl

View File

@@ -5,38 +5,30 @@
namespace xrpl { namespace xrpl {
namespace Resource { namespace Resource {
// clang-format off
/** Schedule of fees charged for imposing load on the server. */ /** Schedule of fees charged for imposing load on the server. */
/** @{ */ /** @{ */
extern Charge const feeMalformedRequest; // A request that we can immediately extern Charge const feeMalformedRequest; // A request that we can immediately tell is invalid.
// tell is invalid extern Charge const feeRequestNoReply; // A request that we cannot satisfy.
extern Charge const feeRequestNoReply; // A request that we cannot satisfy extern Charge const feeInvalidSignature; // An object whose signature we had to check that failed.
extern Charge const feeInvalidSignature; // An object whose signature we had extern Charge const feeUselessData; // Data we have no use for.
// to check and it failed extern Charge const feeInvalidData; // Data we have to verify before rejecting.
extern Charge const feeUselessData; // Data we have no use for
extern Charge const feeInvalidData; // Data we have to verify before
// rejecting
// RPC loads // RPC loads
extern Charge const feeMalformedRPC; // An RPC request that we can extern Charge const feeMalformedRPC; // An RPC request that we can immediately tell is invalid.
// immediately tell is invalid. extern Charge const feeReferenceRPC; // A default "reference" unspecified load.
extern Charge const feeReferenceRPC; // A default "reference" unspecified extern Charge const feeExceptionRPC; // RPC load that causes an exception.
// load extern Charge const feeMediumBurdenRPC; // A somewhat burdensome RPC load.
extern Charge const feeExceptionRPC; // RPC load that causes an exception extern Charge const feeHeavyBurdenRPC; // A very burdensome RPC load.
extern Charge const feeMediumBurdenRPC; // A somewhat burdensome RPC load
extern Charge const feeHeavyBurdenRPC; // A very burdensome RPC load
// Peer loads // Peer loads
extern Charge const feeTrivialPeer; // Requires no reply extern Charge const feeTrivialPeer; // Requires no reply.
extern Charge const feeModerateBurdenPeer; // Requires some work extern Charge const feeModerateBurdenPeer; // Requires some work.
extern Charge const feeHeavyBurdenPeer; // Extensive work extern Charge const feeHeavyBurdenPeer; // Extensive work.
// Administrative // Administrative
extern Charge const feeWarning; // The cost of receiving a warning extern Charge const feeWarning; // The cost of receiving a warning.
extern Charge const feeDrop; // The cost of being dropped for extern Charge const feeDrop; // The cost of being dropped for excess load.
// excess load
/** @} */ /** @} */
// clang-format on
} // namespace Resource } // namespace Resource
} // namespace xrpl } // namespace xrpl

View File

@@ -17,7 +17,7 @@ struct Gossip
{ {
explicit Item() = default; explicit Item() = default;
int balance; int balance{};
beast::IP::Endpoint address; beast::IP::Endpoint address;
}; };

View File

@@ -62,7 +62,7 @@ struct Entry : public beast::List<Entry>::Node
std::optional<PublicKey> publicKey; std::optional<PublicKey> publicKey;
// Back pointer to the map key (bit of a hack here) // Back pointer to the map key (bit of a hack here)
Key const* key; Key const* key{};
// Number of Consumer references // Number of Consumer references
int refcount; int refcount;

View File

@@ -13,7 +13,7 @@ struct Import
{ {
explicit Item() = default; explicit Item() = default;
int balance; int balance{};
Consumer consumer; Consumer consumer;
}; };

View File

@@ -93,7 +93,7 @@ public:
Entry* entry(nullptr); Entry* entry(nullptr);
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
auto [resultIt, resultInserted] = table_.emplace( auto [resultIt, resultInserted] = table_.emplace(
std::piecewise_construct, std::piecewise_construct,
std::make_tuple(kindInbound, address.at_port(0)), // Key std::make_tuple(kindInbound, address.at_port(0)), // Key
@@ -123,7 +123,7 @@ public:
Entry* entry(nullptr); Entry* entry(nullptr);
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
auto [resultIt, resultInserted] = table_.emplace( auto [resultIt, resultInserted] = table_.emplace(
std::piecewise_construct, std::piecewise_construct,
std::make_tuple(kindOutbound, address), // Key std::make_tuple(kindOutbound, address), // Key
@@ -156,7 +156,7 @@ public:
Entry* entry(nullptr); Entry* entry(nullptr);
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
auto [resultIt, resultInserted] = table_.emplace( auto [resultIt, resultInserted] = table_.emplace(
std::piecewise_construct, std::piecewise_construct,
std::make_tuple(kindUnlimited, address.at_port(1)), // Key std::make_tuple(kindUnlimited, address.at_port(1)), // Key
@@ -191,11 +191,11 @@ public:
clock_type::time_point const now(m_clock.now()); clock_type::time_point const now(m_clock.now());
Json::Value ret(Json::objectValue); Json::Value ret(Json::objectValue);
std::lock_guard _(lock_); std::lock_guard const _(lock_);
for (auto& inboundEntry : inbound_) for (auto& inboundEntry : inbound_)
{ {
int localBalance = inboundEntry.local_balance.value(now); int const localBalance = inboundEntry.local_balance.value(now);
if ((localBalance + inboundEntry.remote_balance) >= threshold) if ((localBalance + inboundEntry.remote_balance) >= threshold)
{ {
Json::Value& entry = (ret[inboundEntry.to_string()] = Json::objectValue); Json::Value& entry = (ret[inboundEntry.to_string()] = Json::objectValue);
@@ -206,7 +206,7 @@ public:
} }
for (auto& outboundEntry : outbound_) for (auto& outboundEntry : outbound_)
{ {
int localBalance = outboundEntry.local_balance.value(now); int const localBalance = outboundEntry.local_balance.value(now);
if ((localBalance + outboundEntry.remote_balance) >= threshold) if ((localBalance + outboundEntry.remote_balance) >= threshold)
{ {
Json::Value& entry = (ret[outboundEntry.to_string()] = Json::objectValue); Json::Value& entry = (ret[outboundEntry.to_string()] = Json::objectValue);
@@ -217,7 +217,7 @@ public:
} }
for (auto& adminEntry : admin_) for (auto& adminEntry : admin_)
{ {
int localBalance = adminEntry.local_balance.value(now); int const localBalance = adminEntry.local_balance.value(now);
if ((localBalance + adminEntry.remote_balance) >= threshold) if ((localBalance + adminEntry.remote_balance) >= threshold)
{ {
Json::Value& entry = (ret[adminEntry.to_string()] = Json::objectValue); Json::Value& entry = (ret[adminEntry.to_string()] = Json::objectValue);
@@ -236,7 +236,7 @@ public:
clock_type::time_point const now(m_clock.now()); clock_type::time_point const now(m_clock.now());
Gossip gossip; Gossip gossip;
std::lock_guard _(lock_); std::lock_guard const _(lock_);
gossip.items.reserve(inbound_.size()); gossip.items.reserve(inbound_.size());
@@ -261,7 +261,7 @@ public:
{ {
auto const elapsed = m_clock.now(); auto const elapsed = m_clock.now();
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
auto [resultIt, resultInserted] = importTable_.emplace( auto [resultIt, resultInserted] = importTable_.emplace(
std::piecewise_construct, std::piecewise_construct,
std::make_tuple(origin), // Key std::make_tuple(origin), // Key
@@ -318,7 +318,7 @@ public:
void void
periodicActivity() periodicActivity()
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
auto const elapsed = m_clock.now(); auto const elapsed = m_clock.now();
@@ -374,7 +374,7 @@ public:
void void
erase(Table::iterator iter) erase(Table::iterator iter)
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
Entry& entry(iter->second); Entry& entry(iter->second);
XRPL_ASSERT(entry.refcount == 0, "xrpl::Resource::Logic::erase : entry not used"); XRPL_ASSERT(entry.refcount == 0, "xrpl::Resource::Logic::erase : entry not used");
inactive_.erase(inactive_.iterator_to(entry)); inactive_.erase(inactive_.iterator_to(entry));
@@ -384,14 +384,14 @@ public:
void void
acquire(Entry& entry) acquire(Entry& entry)
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
++entry.refcount; ++entry.refcount;
} }
void void
release(Entry& entry) release(Entry& entry)
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
if (--entry.refcount == 0) if (--entry.refcount == 0)
{ {
JLOG(m_journal.debug()) << "Inactive " << entry; JLOG(m_journal.debug()) << "Inactive " << entry;
@@ -442,7 +442,7 @@ public:
if (!context.empty()) if (!context.empty())
context = " (" + context + ")"; context = " (" + context + ")";
std::lock_guard _(lock_); std::lock_guard const _(lock_);
clock_type::time_point const now(m_clock.now()); clock_type::time_point const now(m_clock.now());
int const balance(entry.add(fee.cost(), now)); int const balance(entry.add(fee.cost(), now));
JLOG(getStream(fee.cost(), m_journal)) << "Charging " << entry << " for " << fee << context; JLOG(getStream(fee.cost(), m_journal)) << "Charging " << entry << " for " << fee << context;
@@ -455,7 +455,7 @@ public:
if (entry.isUnlimited()) if (entry.isUnlimited())
return false; return false;
std::lock_guard _(lock_); std::lock_guard const _(lock_);
bool notify(false); bool notify(false);
auto const elapsed = m_clock.now(); auto const elapsed = m_clock.now();
if (entry.balance(m_clock.now()) >= warningThreshold && elapsed != entry.lastWarningTime) if (entry.balance(m_clock.now()) >= warningThreshold && elapsed != entry.lastWarningTime)
@@ -478,7 +478,7 @@ public:
if (entry.isUnlimited()) if (entry.isUnlimited())
return false; return false;
std::lock_guard _(lock_); std::lock_guard const _(lock_);
bool drop(false); bool drop(false);
clock_type::time_point const now(m_clock.now()); clock_type::time_point const now(m_clock.now());
int const balance(entry.balance(now)); int const balance(entry.balance(now));
@@ -500,7 +500,7 @@ public:
int int
balance(Entry& entry) balance(Entry& entry)
{ {
std::lock_guard _(lock_); std::lock_guard const _(lock_);
return entry.balance(m_clock.now()); return entry.balance(m_clock.now());
} }
@@ -529,7 +529,7 @@ public:
{ {
clock_type::time_point const now(m_clock.now()); clock_type::time_point const now(m_clock.now());
std::lock_guard _(lock_); std::lock_guard const _(lock_);
{ {
beast::PropertyStream::Set s("inbound", map); beast::PropertyStream::Set s("inbound", map);

Some files were not shown because too many files have changed in this diff Show More