|
6 | 6 |
|
7 | 7 | #include <unordered_set> |
8 | 8 |
|
| 9 | +#include "BpfMapMonitor.h" |
| 10 | +#include "FileMonitor.h" |
| 11 | +#include "MagicSaveDataMonitor.h" |
| 12 | +#include "MmappedFileMonitor.h" |
| 13 | +#include "NonvirtualPerfCounterMonitor.h" |
| 14 | +#include "ODirectFileMonitor.h" |
| 15 | +#include "PreserveFileMonitor.h" |
| 16 | +#include "ProcFdDirMonitor.h" |
| 17 | +#include "ProcMemMonitor.h" |
| 18 | +#include "ProcStatMonitor.h" |
| 19 | +#include "RRPageMonitor.h" |
| 20 | +#include "StdioMonitor.h" |
| 21 | +#include "SysCpuMonitor.h" |
9 | 22 | #include "rr/rr.h" |
10 | 23 |
|
11 | 24 | #include "AddressSpace.h" |
@@ -253,4 +266,86 @@ vector<int> FdTable::fds_to_close_after_exec(RecordTask* t) { |
253 | 266 | return fds_to_close; |
254 | 267 | } |
255 | 268 |
|
| 269 | +void FdTable::deserialize(Task* leader, |
| 270 | + const pcp::ProcessSpace::Reader& leader_reader) { |
| 271 | + auto monitors = leader_reader.getMonitors(); |
| 272 | + for (auto m : monitors) { |
| 273 | + FileMonitor::Type t = (FileMonitor::Type)m.getType(); |
| 274 | + auto fd = m.getFd(); |
| 275 | + if (!is_monitoring(m.getFd())) { |
| 276 | + switch (t) { |
| 277 | + case FileMonitor::Base: |
| 278 | + FATAL() << "Can't add abstract type"; |
| 279 | + break; |
| 280 | + case FileMonitor::MagicSaveData: |
| 281 | + add_monitor(leader, fd, new MagicSaveDataMonitor()); |
| 282 | + break; |
| 283 | + case FileMonitor::Mmapped: { |
| 284 | + const auto mmap = m.getMmap(); |
| 285 | + add_monitor(leader, fd, |
| 286 | + new MmappedFileMonitor(mmap.getDead(), mmap.getDevice(), |
| 287 | + mmap.getInode())); |
| 288 | + } break; |
| 289 | + case FileMonitor::Preserve: |
| 290 | + add_monitor(leader, fd, new PreserveFileMonitor()); |
| 291 | + break; |
| 292 | + case FileMonitor::ProcFd: { |
| 293 | + const auto p_fd = m.getProcFd(); |
| 294 | + const auto tuid = TaskUid(p_fd.getTid(), p_fd.getSerial()); |
| 295 | + add_monitor(leader, fd, new ProcFdDirMonitor(tuid)); |
| 296 | + break; |
| 297 | + } |
| 298 | + case FileMonitor::ProcMem: { |
| 299 | + const auto pmem = m.getProcMem(); |
| 300 | + add_monitor(leader, fd, |
| 301 | + new ProcMemMonitor(AddressSpaceUid(pmem.getTid(), |
| 302 | + pmem.getSerial(), |
| 303 | + pmem.getExecCount()))); |
| 304 | + } break; |
| 305 | + case FileMonitor::Stdio: |
| 306 | + add_monitor(leader, fd, new StdioMonitor(m.getStdio())); |
| 307 | + break; |
| 308 | + case FileMonitor::VirtualPerfCounter: |
| 309 | + FATAL() << "VirtualPerCounter Monitor deserializing unimplemented!\n"; |
| 310 | + break; |
| 311 | + case FileMonitor::NonvirtualPerfCounter: |
| 312 | + add_monitor(leader, fd, new NonvirtualPerfCounterMonitor()); |
| 313 | + break; |
| 314 | + case FileMonitor::SysCpu: |
| 315 | + add_monitor(leader, fd, new SysCpuMonitor(leader, "")); |
| 316 | + break; |
| 317 | + case FileMonitor::ProcStat: |
| 318 | + add_monitor( |
| 319 | + leader, fd, |
| 320 | + new ProcStatMonitor(leader, data_to_str(m.getProcStat()))); |
| 321 | + break; |
| 322 | + case FileMonitor::RRPage: |
| 323 | + add_monitor(leader, fd, new RRPageMonitor()); |
| 324 | + break; |
| 325 | + case FileMonitor::ODirect: |
| 326 | + add_monitor(leader, fd, new ODirectFileMonitor()); |
| 327 | + break; |
| 328 | + case FileMonitor::BpfMap: |
| 329 | + add_monitor(leader, fd, |
| 330 | + new BpfMapMonitor(m.getBpf().getKeySize(), |
| 331 | + m.getBpf().getValueSize())); |
| 332 | + break; |
| 333 | + default: |
| 334 | + FATAL() << "unhandled FileMonitor: " << file_monitor_type_name(t); |
| 335 | + } |
| 336 | + } |
| 337 | + } |
| 338 | +} |
| 339 | + |
| 340 | +void FdTable::serialize(pcp::ProcessSpace::Builder& leader_builder) const { |
| 341 | + auto serialized_fd_mons = leader_builder.initMonitors(fds.size()); |
| 342 | + auto mon_index = 0; |
| 343 | + for (const auto& mon : fds) { |
| 344 | + const auto fd = mon.first; |
| 345 | + const auto& monitor = mon.second; |
| 346 | + auto builder = serialized_fd_mons[mon_index++]; |
| 347 | + monitor->serialize(fd, builder); |
| 348 | + } |
| 349 | +} |
| 350 | + |
256 | 351 | } // namespace rr |
0 commit comments