mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-12 05:49:56 -04:00
feat: show memory usage in mkdwarfs
This commit is contained in:
parent
4751d9201a
commit
038541f94e
@ -33,6 +33,7 @@
|
|||||||
#include <exception>
|
#include <exception>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
|
#include <optional>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
@ -85,4 +86,6 @@ void install_signal_handlers();
|
|||||||
|
|
||||||
std::tm safe_localtime(std::time_t t);
|
std::tm safe_localtime(std::time_t t);
|
||||||
|
|
||||||
|
std::optional<size_t> get_self_memory_usage();
|
||||||
|
|
||||||
} // namespace dwarfs
|
} // namespace dwarfs
|
||||||
|
@ -44,6 +44,7 @@ class console_writer : public stream_logger {
|
|||||||
public:
|
public:
|
||||||
enum display_mode { NORMAL, REWRITE };
|
enum display_mode { NORMAL, REWRITE };
|
||||||
enum progress_mode { NONE, SIMPLE, ASCII, UNICODE };
|
enum progress_mode { NONE, SIMPLE, ASCII, UNICODE };
|
||||||
|
using mem_usage_fn = std::function<size_t()>;
|
||||||
|
|
||||||
console_writer(std::shared_ptr<terminal const> term, std::ostream& os,
|
console_writer(std::shared_ptr<terminal const> term, std::ostream& os,
|
||||||
progress_mode pg_mode, display_mode mode = NORMAL,
|
progress_mode pg_mode, display_mode mode = NORMAL,
|
||||||
@ -51,6 +52,8 @@ class console_writer : public stream_logger {
|
|||||||
|
|
||||||
void update(writer_progress& prog, bool last);
|
void update(writer_progress& prog, bool last);
|
||||||
|
|
||||||
|
void set_memory_usage_function(mem_usage_fn func) { mem_usage_ = func; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void preamble(std::ostream& os) override;
|
void preamble(std::ostream& os) override;
|
||||||
void postamble(std::ostream& os) override;
|
void postamble(std::ostream& os) override;
|
||||||
@ -63,6 +66,7 @@ class console_writer : public stream_logger {
|
|||||||
std::atomic<size_t> counter_{0};
|
std::atomic<size_t> counter_{0};
|
||||||
progress_mode const pg_mode_;
|
progress_mode const pg_mode_;
|
||||||
display_mode const mode_;
|
display_mode const mode_;
|
||||||
|
mem_usage_fn mem_usage_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace writer
|
} // namespace writer
|
||||||
|
40
src/util.cpp
40
src/util.cpp
@ -32,6 +32,7 @@
|
|||||||
#include <clocale>
|
#include <clocale>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
@ -63,6 +64,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <dwarfs/conv.h>
|
#include <dwarfs/conv.h>
|
||||||
#include <dwarfs/error.h>
|
#include <dwarfs/error.h>
|
||||||
#include <dwarfs/util.h>
|
#include <dwarfs/util.h>
|
||||||
@ -584,4 +589,39 @@ std::tm safe_localtime(std::time_t t) {
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<size_t> get_self_memory_usage() {
|
||||||
|
#if defined(_WIN32)
|
||||||
|
// TODO
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
task_vm_info info{};
|
||||||
|
mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
|
||||||
|
|
||||||
|
if (task_info(mach_task_self(), TASK_VM_INFO,
|
||||||
|
reinterpret_cast<task_info_t>(&info), &count) == KERN_SUCCESS) {
|
||||||
|
return info.phys_footprint;
|
||||||
|
}
|
||||||
|
#elif defined(__linux__)
|
||||||
|
static constexpr auto kSmapsPath{"/proc/self/smaps_rollup"};
|
||||||
|
std::ifstream smaps(kSmapsPath);
|
||||||
|
|
||||||
|
if (smaps) {
|
||||||
|
std::string line;
|
||||||
|
|
||||||
|
while (std::getline(smaps, line)) {
|
||||||
|
if (line.starts_with("Pss:")) {
|
||||||
|
std::string_view size_str(line);
|
||||||
|
size_str.remove_prefix(size_str.find_first_not_of(" \t", 4));
|
||||||
|
size_t size;
|
||||||
|
auto [endp, ec] = std::from_chars(
|
||||||
|
size_str.data(), size_str.data() + size_str.size(), size);
|
||||||
|
if (ec == std::errc() && std::string_view(endp).starts_with(" kB")) {
|
||||||
|
return size * 1024;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return std::nullopt; // Not implemented
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace dwarfs
|
} // namespace dwarfs
|
||||||
|
@ -285,7 +285,7 @@ void console_writer::update(writer_progress& prog, bool last) {
|
|||||||
<< newline
|
<< newline
|
||||||
|
|
||||||
<< "compressed filesystem: " << p.blocks_written << " blocks/"
|
<< "compressed filesystem: " << p.blocks_written << " blocks/"
|
||||||
<< size_with_unit(p.compressed_size) << " written" << newline;
|
<< size_with_unit(p.compressed_size) << " written";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REWRITE:
|
case REWRITE:
|
||||||
@ -295,9 +295,15 @@ void console_writer::update(writer_progress& prog, bool last) {
|
|||||||
|
|
||||||
<< "compressed filesystem: " << p.blocks_written << "/"
|
<< "compressed filesystem: " << p.blocks_written << "/"
|
||||||
<< p.block_count << " blocks/" << size_with_unit(p.compressed_size)
|
<< p.block_count << " blocks/" << size_with_unit(p.compressed_size)
|
||||||
<< " written" << newline;
|
<< " written";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mem_usage_) {
|
||||||
|
oss << ", using " << size_with_unit(mem_usage_()) << " of RAM";
|
||||||
|
}
|
||||||
|
|
||||||
|
oss << newline;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pg_mode_ == NONE) {
|
if (pg_mode_ == NONE) {
|
||||||
|
@ -996,6 +996,11 @@ int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
|
|||||||
: writer::console_writer::NORMAL,
|
: writer::console_writer::NORMAL,
|
||||||
logopts);
|
logopts);
|
||||||
|
|
||||||
|
if (get_self_memory_usage()) {
|
||||||
|
lgr.set_memory_usage_function(
|
||||||
|
[] { return get_self_memory_usage().value_or(0); });
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<writer::rule_based_entry_filter> rule_filter;
|
std::unique_ptr<writer::rule_based_entry_filter> rule_filter;
|
||||||
|
|
||||||
if (!filter.empty()) {
|
if (!filter.empty()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user