benchmark silo added
[c11concurrency-benchmarks.git] / silo / stats_common.h
1 #pragma once
2
3 #include "counter.h"
4 #include "macros.h"
5 #include "fileutils.h"
6
7 enum class stats_command : uint8_t { GET_COUNTER_VALUE = 0x1 };
8
9 struct get_counter_value_t {
10   uint64_t timestamp_us_; // usec
11   counter_data d_;
12 };
13
14 class packet {
15 public:
16   static const size_t MAX_DATA = 0xFFFF - 4;
17   packet() : size_(0) {}
18   inline void clear() { size_ = 0; }
19   inline void
20   assign(const char *p, size_t n)
21   {
22     INVARIANT(n <= MAX_DATA);
23     NDB_MEMCPY(&data_[0], p, n);
24     size_ = n;
25   }
26   inline void
27   assign(const std::string &s)
28   {
29     assign(s.data(), s.size());
30   }
31   int
32   sendpkt(int fd) const
33   {
34     // XXX: we don't care about endianness
35     return fileutils::writeall(
36         fd, (const char *) &size_, sizeof(size_) + size_);
37   }
38   int
39   recvpkt(int fd)
40   {
41     // XXX: we don't care about endianness
42     int r;
43     if ((r = fileutils::readall(fd, (char *) &size_, sizeof(size_)))) {
44       clear();
45       return r;
46     }
47     if (size_ > packet::MAX_DATA) {
48       std::cerr << "bad packet read with excessive size" << std::endl;
49       clear();
50       return -1;
51     }
52     if ((r = fileutils::readall(fd, &data_[0], size_))) {
53       clear();
54       return r;
55     }
56     return 0;
57   }
58   inline uint32_t size() const { return size_; }
59   inline const char * data() const { return &data_[0]; }
60 private:
61   uint32_t size_;
62   char data_[MAX_DATA];
63 };