Program Listing for File fromhost_monitor.hpp

Return to documentation for file (fromhost_monitor.hpp)

#ifndef FELIX_FROMHOST_MONITOR_H_
#define FELIX_FROMHOST_MONITOR_H_

#include "monitor.hpp"
#include <cstdint>


struct FromHostDeviceStats
{
    int device_id;

    explicit FromHostDeviceStats(int d)
        : device_id(d) {};
};


struct FromHostDmaStats
{
    int dmaid;
    uint32_t dma_free_MB;
    uint64_t msg_counter;
    float msg_rate_Hz;
    uint64_t bytes_counter;
    float msg_rate_Mbps;
    struct timespec ts;

    FromHostDmaStats get_increment(FromHostDmaStats & stats);

    FromHostDmaStats()
        : dmaid(0), dma_free_MB(0), msg_counter(0), msg_rate_Hz(0), bytes_counter(0), msg_rate_Mbps(0)
        {
            clock_gettime(CLOCK_MONOTONIC_RAW , &ts);
        };

    explicit FromHostDmaStats(uint32_t d, uint32_t MB, uint64_t msg, uint64_t bytes)
        : dmaid(d), dma_free_MB(MB), msg_counter(msg), msg_rate_Hz(0), bytes_counter(bytes), msg_rate_Mbps(0)
        {
            clock_gettime(CLOCK_MONOTONIC_RAW , &ts);
        };
};


struct FromHostWriterStats
{
    int writer_id;
    char type;
    unsigned int number_of_connections;

    explicit FromHostWriterStats(int wi, char t, uint32_t s) :
        writer_id(wi),
        type(t),
        number_of_connections(s) { };
};


struct FromHostElinkStats
{
    uint64_t fid              = 0;
    uint64_t processed_msg    = 0;
    uint64_t processed_bytes  = 0;
    uint64_t largest_msg_size = 0;
    float rate_msg_Hz         = 0;
    float rate_msg_Mbps       = 0;
    uint64_t dropped_msg      = 0;
    struct timespec ts;

    void on_processed_msg(uint32_t size_bytes);
    FromHostElinkStats get_increment(FromHostElinkStats & stats);
    FromHostElinkStats() = default;

    explicit FromHostElinkStats(uint64_t f) : fid(f), processed_msg(0),  processed_bytes(0),
        largest_msg_size(0), rate_msg_Hz(0), rate_msg_Mbps(0), dropped_msg(0)
        {
            clock_gettime(CLOCK_MONOTONIC_RAW , &ts);
        };
};


class FromHostMonitor : public Monitor
{
    public:
        explicit FromHostMonitor(std::string& fifoname) : Monitor(fifoname) {
        }
        //These functions are called in a nested loop with hierarchy
        //devices > dmas > writers > elinks.
        void append_device_stats(const std::string& ts, const std::string& hostname, const FromHostDeviceStats & s);
        void append_dma_stats(const std::string& ts, const std::string& hostname, int deviceid, const FromHostDmaStats & s);
        void append_writer_stats(const std::string& ts, const std::string& hostname, int deviceid, int dma_id, const FromHostWriterStats & s);
        void append_elink_stats(const std::string& ts, const std::string& hostname, int device, int dma_id, int reader_id, const FromHostElinkStats & s);
};

#endif /* FELIX_FROMHOST_MONITOR_H_ */