diff options
Diffstat (limited to 'src/monitor-gui.cc')
| -rw-r--r-- | src/monitor-gui.cc | 59 |
1 files changed, 51 insertions, 8 deletions
diff --git a/src/monitor-gui.cc b/src/monitor-gui.cc index 61c720f..f4f80d5 100644 --- a/src/monitor-gui.cc +++ b/src/monitor-gui.cc @@ -126,9 +126,12 @@ public: std::string from; std::string to; std::string size; + std::string duration; std::string data; + struct timespec last; + size_t related; Package() @@ -141,7 +144,7 @@ public: } size_t columns() const override { - return 4; + return 5; } std::string header(size_t column) const override { @@ -154,6 +157,8 @@ public: return "To"; case 3: return "Data"; + case 4: + return "Duration"; } assert(false); return ""; @@ -167,6 +172,7 @@ public: case 1: return pkg.from; case 2: return pkg.to; case 3: return pkg.size; + case 4: return pkg.duration; } } assert(false); @@ -187,10 +193,12 @@ public: packages_.emplace_back(); auto& pkg = packages_.back(); pkg.pkg = package; + pkg.last = package.timestamp; format_timestamp(&pkg.timestamp, package.timestamp); format_host_port(&pkg.from, package.source_host, package.source_port); format_host_port(&pkg.to, package.target_host, package.target_port); format_size(&pkg.size, 0, false); + format_duration(&pkg.duration, pkg.pkg.timestamp, pkg.last, false); auto related = related_.find(pkg.to); if (related == related_.end()) { @@ -204,7 +212,8 @@ public: notify_added(index, index); } - size_t package_data(uint32_t id, char const* data, size_t size, bool last) { + size_t package_data(uint32_t id, char const* data, size_t size, bool last, + struct timespec timestamp) { auto it = open_.find(id); if (it == open_.end()) { return std::string::npos; @@ -213,6 +222,8 @@ public: auto& pkg = packages_[index]; pkg.data.append(data, size); format_size(&pkg.size, pkg.data.size(), last); + pkg.last = timestamp; + format_duration(&pkg.duration, pkg.pkg.timestamp, pkg.last, last); if (last) open_.erase(it); notify_changed(index, index); @@ -271,6 +282,31 @@ private: out->assign(tmp, len); } + static void format_duration(std::string* out, struct timespec const& start, + struct timespec const& end, bool) { + char tmp[50]; + if (start.tv_sec == end.tv_sec) { + if (start.tv_nsec == end.tv_nsec) { + out->clear(); + return; + } + auto len = snprintf(tmp, sizeof(tmp), "%lums", + static_cast<unsigned long>( + (end.tv_nsec - start.tv_nsec) / 1000000)); + out->assign(tmp, len); + } else { + auto s = end.tv_sec - start.tv_sec; + auto n = (end.tv_nsec - start.tv_nsec) / 1000000; + if (n < 0) { + --s; + n += 1000; + } + auto len = snprintf(tmp, sizeof(tmp), "%ld.%03lus", + static_cast<long>(s), static_cast<unsigned long>(n)); + out->assign(tmp, len); + } + } + void notify_added(size_t first, size_t last) { auto it = listeners_.notify(); while (it.has_next()) { @@ -689,16 +725,21 @@ private: : packages_(packages) { } - void package(Package const& package) override { + void package(Package const& package, struct timespec end) override { packages_->package(package); + id_ = package.id; + timestamp_ = end; } void data(uint32_t id, char const* data, size_t size, bool last) override { - packages_->package_data(id, data, size, last); + assert(id_ == id); + packages_->package_data(id, data, size, last, timestamp_); } private: PackageList* const packages_; + uint32_t id_; + struct timespec timestamp_; }; public: @@ -1177,9 +1218,10 @@ public: } void package_data(Monitor* monitor, uint32_t id, - char const* data, size_t size, bool last) override { + char const* data, size_t size, bool last, + struct timespec timestamp) override { assert(monitor == monitor_.get()); - auto index = packages_->package_data(id, data, size, last); + auto index = packages_->package_data(id, data, size, last, timestamp); auto const& pkg = packages_->package(index); protocols_->update(index, pkg.data.data(), pkg.data.size()); if (has_selection_ && index == selection_) { @@ -1416,7 +1458,8 @@ private: packages->package(pkg); packages->package_data(pkg.id, reinterpret_cast<char const*>(data) + offset + len_ip + len_tcp, - len - offset - len_ip - len_tcp, true); + len - offset - len_ip - len_tcp, true, + pkg.timestamp); } else if (ret == -2) { break; } else if (ret == -1) { @@ -1638,7 +1681,7 @@ private: auto writer = std::unique_ptr<PackagesWriter>(PackagesWriter::create(&out)); for (size_t i = 0; i < packages->rows(); ++i) { auto const& pkg = packages->package(i); - writer->write(pkg.pkg, pkg.data); + writer->write(pkg.pkg, pkg.data, pkg.last); } writer->flush(); if (!out.good()) { |
