Commit 433f1dae19b63f263af8a3d3cc9b3e328171d9ca
1 parent
0a542476
Add --report-mem-usage option for debugging/testing
Showing
11 changed files
with
46 additions
and
8 deletions
include/qpdf/QPDFJob.hh
| @@ -711,6 +711,7 @@ class QPDFJob | @@ -711,6 +711,7 @@ class QPDFJob | ||
| 711 | bool json_input; | 711 | bool json_input; |
| 712 | bool json_output; | 712 | bool json_output; |
| 713 | std::string update_from_json; | 713 | std::string update_from_json; |
| 714 | + bool report_mem_usage; | ||
| 714 | }; | 715 | }; |
| 715 | std::shared_ptr<Members> m; | 716 | std::shared_ptr<Members> m; |
| 716 | }; | 717 | }; |
include/qpdf/auto_job_c_main.hh
| @@ -33,6 +33,7 @@ QPDF_DLL Config* qdf(); | @@ -33,6 +33,7 @@ QPDF_DLL Config* qdf(); | ||
| 33 | QPDF_DLL Config* rawStreamData(); | 33 | QPDF_DLL Config* rawStreamData(); |
| 34 | QPDF_DLL Config* recompressFlate(); | 34 | QPDF_DLL Config* recompressFlate(); |
| 35 | QPDF_DLL Config* removePageLabels(); | 35 | QPDF_DLL Config* removePageLabels(); |
| 36 | +QPDF_DLL Config* reportMemUsage(); | ||
| 36 | QPDF_DLL Config* requiresPassword(); | 37 | QPDF_DLL Config* requiresPassword(); |
| 37 | QPDF_DLL Config* showEncryption(); | 38 | QPDF_DLL Config* showEncryption(); |
| 38 | QPDF_DLL Config* showEncryptionKey(); | 39 | QPDF_DLL Config* showEncryptionKey(); |
job.sums
| @@ -3,15 +3,15 @@ generate_auto_job 9abe2ec994fb98526f5e3c0c199ce2e61a868463cb522a5bc6e9730b655341 | @@ -3,15 +3,15 @@ generate_auto_job 9abe2ec994fb98526f5e3c0c199ce2e61a868463cb522a5bc6e9730b655341 | ||
| 3 | include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4 | 3 | include/qpdf/auto_job_c_att.hh 4c2b171ea00531db54720bf49a43f8b34481586ae7fb6cbf225099ee42bc5bb4 |
| 4 | include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42 | 4 | include/qpdf/auto_job_c_copy_att.hh 50609012bff14fd82f0649185940d617d05d530cdc522185c7f3920a561ccb42 |
| 5 | include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5 | 5 | include/qpdf/auto_job_c_enc.hh 28446f3c32153a52afa239ea40503e6cc8ac2c026813526a349e0cd4ae17ddd5 |
| 6 | -include/qpdf/auto_job_c_main.hh cdba1ae6ea5525a585d10a3dd95b7996d62b17de4211fe658b78d9d463b0f313 | 6 | +include/qpdf/auto_job_c_main.hh 493b9798f5ff8bbcb07c0238693554d77eefa4ae71ce1a0d466de94e3a7a3966 |
| 7 | include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec | 7 | include/qpdf/auto_job_c_pages.hh b3cc0f21029f6d89efa043dcdbfa183cb59325b6506001c18911614fe8e568ec |
| 8 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 | 8 | include/qpdf/auto_job_c_uo.hh ae21b69a1efa9333050f4833d465f6daff87e5b38e5106e49bbef5d4132e4ed1 |
| 9 | -job.yml f9564f18b08a45d17328af43652645771d3498471820c858b8c9013a193e1412 | 9 | +job.yml a6f22d425980ed960c77c0a4197f46924c14e7943358cd9f0b75811bb1c480ad |
| 10 | libqpdf/qpdf/auto_job_decl.hh 7844eba58edffb9494b19e8eca6fd59a24d6e152ca606c3b07da569f753df2da | 10 | libqpdf/qpdf/auto_job_decl.hh 7844eba58edffb9494b19e8eca6fd59a24d6e152ca606c3b07da569f753df2da |
| 11 | -libqpdf/qpdf/auto_job_help.hh 53306e4aef8aaca641c0087bc9e064ada1c44a94b826c0bcac7b4eb0c8c41fd5 | ||
| 12 | -libqpdf/qpdf/auto_job_init.hh fd1635a5ad6ba16b7ae008467145560a59a5ecfd10d29c5ef7cd0d8347747cd2 | 11 | +libqpdf/qpdf/auto_job_help.hh 3e9385a7e0dae993467647466fa30f30baa5968f9270c73ff4e664f5aa415dbe |
| 12 | +libqpdf/qpdf/auto_job_init.hh ccb881733849dff5c05721f1aa5c35447cedd415e881c3fef6573901e45be056 | ||
| 13 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 | 13 | libqpdf/qpdf/auto_job_json_decl.hh 06caa46eaf71db8a50c046f91866baa8087745a9474319fb7c86d92634cc8297 |
| 14 | -libqpdf/qpdf/auto_job_json_init.hh 59545578a2e47c660ff98516ed53f06638be75eb4658e2a09d32cc08e0cb7268 | ||
| 15 | -libqpdf/qpdf/auto_job_schema.hh 5352ef1be1ad7cc6f4f36dab88f2937d278e6bd3a0e2d46259794dc226c8ba6b | 14 | +libqpdf/qpdf/auto_job_json_init.hh 7ac8f42fb39eda56144ab62b30152a56e9bb2224d0596eb826b7bc421a78d26b |
| 15 | +libqpdf/qpdf/auto_job_schema.hh 17352791b09c3b8a8db766375cce31d70c98b67b44ecc398e2ac78984e34fe90 | ||
| 16 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 | 16 | manual/_ext/qpdf.py 6add6321666031d55ed4aedf7c00e5662bba856dfcd66ccb526563bffefbb580 |
| 17 | -manual/cli.rst 41ee93f23f46160fe9eaf7c99fd2ab3bd2e0f6792a341a35bdac1a41cb853ed5 | 17 | +manual/cli.rst e3fa48bb30c981df1f74d474887155cd6a46f9010b91cd1b7b57e582bf3bf877 |
job.yml
| @@ -127,6 +127,7 @@ options: | @@ -127,6 +127,7 @@ options: | ||
| 127 | - recompress-flate | 127 | - recompress-flate |
| 128 | - remove-page-labels | 128 | - remove-page-labels |
| 129 | - replace-input | 129 | - replace-input |
| 130 | + - report-mem-usage | ||
| 130 | - requires-password | 131 | - requires-password |
| 131 | - show-encryption | 132 | - show-encryption |
| 132 | - show-encryption-key | 133 | - show-encryption-key |
| @@ -413,6 +414,7 @@ json: | @@ -413,6 +414,7 @@ json: | ||
| 413 | Pages.password: | 414 | Pages.password: |
| 414 | _range: "page range" | 415 | _range: "page range" |
| 415 | remove-page-labels: | 416 | remove-page-labels: |
| 417 | + report-mem-usage: | ||
| 416 | rotate: | 418 | rotate: |
| 417 | overlay: | 419 | overlay: |
| 418 | _file: "source file for overlay" | 420 | _file: "source file for overlay" |
libqpdf/QPDFJob.cc
| @@ -417,7 +417,8 @@ QPDFJob::Members::Members() : | @@ -417,7 +417,8 @@ QPDFJob::Members::Members() : | ||
| 417 | check_is_encrypted(false), | 417 | check_is_encrypted(false), |
| 418 | check_requires_password(false), | 418 | check_requires_password(false), |
| 419 | json_input(false), | 419 | json_input(false), |
| 420 | - json_output(false) | 420 | + json_output(false), |
| 421 | + report_mem_usage(false) | ||
| 421 | { | 422 | { |
| 422 | } | 423 | } |
| 423 | 424 | ||
| @@ -625,6 +626,14 @@ QPDFJob::run() | @@ -625,6 +626,14 @@ QPDFJob::run() | ||
| 625 | << ": operation succeeded with warnings\n"; | 626 | << ": operation succeeded with warnings\n"; |
| 626 | } | 627 | } |
| 627 | } | 628 | } |
| 629 | + if (m->report_mem_usage) { | ||
| 630 | + // Call get_max_memory_usage before generating output. When | ||
| 631 | + // debugging, it's easier if print statements from | ||
| 632 | + // get_max_memory_usage are not interleaved with the output. | ||
| 633 | + auto mem_usage = QUtil::get_max_memory_usage(); | ||
| 634 | + *this->m->log->getWarn() | ||
| 635 | + << "qpdf-max-memory-usage " << mem_usage << "\n"; | ||
| 636 | + } | ||
| 628 | } | 637 | } |
| 629 | 638 | ||
| 630 | bool | 639 | bool |
libqpdf/QPDFJob_config.cc
| @@ -503,6 +503,13 @@ QPDFJob::Config::removePageLabels() | @@ -503,6 +503,13 @@ QPDFJob::Config::removePageLabels() | ||
| 503 | } | 503 | } |
| 504 | 504 | ||
| 505 | QPDFJob::Config* | 505 | QPDFJob::Config* |
| 506 | +QPDFJob::Config::reportMemUsage() | ||
| 507 | +{ | ||
| 508 | + o.m->report_mem_usage = true; | ||
| 509 | + return this; | ||
| 510 | +} | ||
| 511 | + | ||
| 512 | +QPDFJob::Config* | ||
| 506 | QPDFJob::Config::requiresPassword() | 513 | QPDFJob::Config::requiresPassword() |
| 507 | { | 514 | { |
| 508 | o.m->check_requires_password = true; | 515 | o.m->check_requires_password = true; |
libqpdf/qpdf/auto_job_help.hh
| @@ -883,6 +883,9 @@ for debugging qpdf. | @@ -883,6 +883,9 @@ for debugging qpdf. | ||
| 883 | ap.addOptionHelp("--test-json-schema", "testing", "test generated json against schema", R"(This is used by qpdf's test suite to check consistency between | 883 | ap.addOptionHelp("--test-json-schema", "testing", "test generated json against schema", R"(This is used by qpdf's test suite to check consistency between |
| 884 | the output of qpdf --json and the output of qpdf --json-help. | 884 | the output of qpdf --json and the output of qpdf --json-help. |
| 885 | )"); | 885 | )"); |
| 886 | +ap.addOptionHelp("--report-mem-usage", "testing", "best effort report of memory usage", R"(This is used by qpdf's performance test suite to report the | ||
| 887 | +maximum amount of memory used in supported environments. | ||
| 888 | +)"); | ||
| 886 | } | 889 | } |
| 887 | static void add_help(QPDFArgParser& ap) | 890 | static void add_help(QPDFArgParser& ap) |
| 888 | { | 891 | { |
libqpdf/qpdf/auto_job_init.hh
| @@ -69,6 +69,7 @@ this->ap.addBare("raw-stream-data", [this](){c_main->rawStreamData();}); | @@ -69,6 +69,7 @@ this->ap.addBare("raw-stream-data", [this](){c_main->rawStreamData();}); | ||
| 69 | this->ap.addBare("recompress-flate", [this](){c_main->recompressFlate();}); | 69 | this->ap.addBare("recompress-flate", [this](){c_main->recompressFlate();}); |
| 70 | this->ap.addBare("remove-page-labels", [this](){c_main->removePageLabels();}); | 70 | this->ap.addBare("remove-page-labels", [this](){c_main->removePageLabels();}); |
| 71 | this->ap.addBare("replace-input", b(&ArgParser::argReplaceInput)); | 71 | this->ap.addBare("replace-input", b(&ArgParser::argReplaceInput)); |
| 72 | +this->ap.addBare("report-mem-usage", [this](){c_main->reportMemUsage();}); | ||
| 72 | this->ap.addBare("requires-password", [this](){c_main->requiresPassword();}); | 73 | this->ap.addBare("requires-password", [this](){c_main->requiresPassword();}); |
| 73 | this->ap.addBare("show-encryption", [this](){c_main->showEncryption();}); | 74 | this->ap.addBare("show-encryption", [this](){c_main->showEncryption();}); |
| 74 | this->ap.addBare("show-encryption-key", [this](){c_main->showEncryptionKey();}); | 75 | this->ap.addBare("show-encryption-key", [this](){c_main->showEncryptionKey();}); |
libqpdf/qpdf/auto_job_json_init.hh
| @@ -409,6 +409,9 @@ popHandler(); // key: pages | @@ -409,6 +409,9 @@ popHandler(); // key: pages | ||
| 409 | pushKey("removePageLabels"); | 409 | pushKey("removePageLabels"); |
| 410 | addBare([this]() { c_main->removePageLabels(); }); | 410 | addBare([this]() { c_main->removePageLabels(); }); |
| 411 | popHandler(); // key: removePageLabels | 411 | popHandler(); // key: removePageLabels |
| 412 | +pushKey("reportMemUsage"); | ||
| 413 | +addBare([this]() { c_main->reportMemUsage(); }); | ||
| 414 | +popHandler(); // key: reportMemUsage | ||
| 412 | pushKey("rotate"); | 415 | pushKey("rotate"); |
| 413 | addParameter([this](std::string const& p) { c_main->rotate(p); }); | 416 | addParameter([this](std::string const& p) { c_main->rotate(p); }); |
| 414 | popHandler(); // key: rotate | 417 | popHandler(); // key: rotate |
libqpdf/qpdf/auto_job_schema.hh
| @@ -144,6 +144,7 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ | @@ -144,6 +144,7 @@ static constexpr char const* JOB_SCHEMA_DATA = R"({ | ||
| 144 | } | 144 | } |
| 145 | ], | 145 | ], |
| 146 | "removePageLabels": "remove explicit page numbers", | 146 | "removePageLabels": "remove explicit page numbers", |
| 147 | + "reportMemUsage": "best effort report of memory usage", | ||
| 147 | "rotate": "rotate pages", | 148 | "rotate": "rotate pages", |
| 148 | "overlay": { | 149 | "overlay": { |
| 149 | "file": "source file for overlay", | 150 | "file": "source file for overlay", |
manual/cli.rst
| @@ -3463,6 +3463,16 @@ Related Options | @@ -3463,6 +3463,16 @@ Related Options | ||
| 3463 | memory and is therefore unsuitable for use with large files. This | 3463 | memory and is therefore unsuitable for use with large files. This |
| 3464 | is why it's also not on by default. | 3464 | is why it's also not on by default. |
| 3465 | 3465 | ||
| 3466 | +.. qpdf:option:: --report-mem-usage | ||
| 3467 | + | ||
| 3468 | + .. help: best effort report of memory usage | ||
| 3469 | + | ||
| 3470 | + This is used by qpdf's performance test suite to report the | ||
| 3471 | + maximum amount of memory used in supported environments. | ||
| 3472 | + | ||
| 3473 | + This is used by qpdf's performance test suite to report the maximum | ||
| 3474 | + amount of memory used in supported environments. | ||
| 3475 | + | ||
| 3466 | .. _unicode-passwords: | 3476 | .. _unicode-passwords: |
| 3467 | 3477 | ||
| 3468 | Unicode Passwords | 3478 | Unicode Passwords |