gator: Version 5.18
[firefly-linux-kernel-4.4.55.git] / tools / gator / daemon / Buffer.h
1 /**
2  * Copyright (C) ARM Limited 2013-2014. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #ifndef BUFFER_H
10 #define BUFFER_H
11
12 #include <stdint.h>
13 #include <semaphore.h>
14
15 #include "k/perf_event.h"
16
17 class Sender;
18
19 enum {
20         FRAME_SUMMARY       =  1,
21         FRAME_BLOCK_COUNTER =  5,
22         FRAME_EXTERNAL      = 10,
23         FRAME_PERF_ATTRS    = 11,
24         FRAME_PERF          = 12,
25 };
26
27 class Buffer {
28 public:
29         static const size_t MAXSIZE_PACK32 = 5;
30         static const size_t MAXSIZE_PACK64 = 10;
31
32         Buffer(int32_t core, int32_t buftype, const int size, sem_t *const readerSem);
33         ~Buffer();
34
35         void write(Sender *sender);
36
37         int bytesAvailable() const;
38         int contiguousSpaceAvailable() const;
39         void commit(const uint64_t time);
40         void check(const uint64_t time);
41
42         void frame();
43
44         // Summary messages
45         void summary(const int64_t timestamp, const int64_t uptime, const int64_t monotonicDelta, const char *const uname);
46         void coreName(const int core, const int cpuid, const char *const name);
47
48         // Block Counter messages
49         bool eventHeader(uint64_t curr_time);
50         bool eventTid(int tid);
51         void event(int32_t key, int32_t value);
52         void event64(int64_t key, int64_t value);
53
54         // Perf Attrs messages
55         void pea(const struct perf_event_attr *const pea, int key);
56         void keys(const int count, const __u64 *const ids, const int *const keys);
57         void format(const int length, const char *const format);
58         void maps(const int pid, const int tid, const char *const maps);
59         void comm(const int pid, const int tid, const char *const image, const char *const comm);
60
61         void setDone();
62         bool isDone() const;
63
64         // Prefer a new member to using these functions if possible
65         char *getWritePos() { return mBuf + mWritePos; }
66         void advanceWrite(int bytes) { mWritePos = (mWritePos + bytes) & /*mask*/(mSize - 1); }
67
68         static void writeLEInt(unsigned char *buf, int v) {
69                 buf[0] = (v >> 0) & 0xFF;
70                 buf[1] = (v >> 8) & 0xFF;
71                 buf[2] = (v >> 16) & 0xFF;
72                 buf[3] = (v >> 24) & 0xFF;
73         }
74
75 private:
76         bool commitReady() const;
77         bool checkSpace(int bytes);
78
79         void packInt(int32_t x);
80         void packInt64(int64_t x);
81         void writeBytes(const void *const data, size_t count);
82         void writeString(const char *const str);
83
84         const int32_t mCore;
85         const int32_t mBufType;
86         const int mSize;
87         int mReadPos;
88         int mWritePos;
89         int mCommitPos;
90         bool mAvailable;
91         bool mIsDone;
92         char *const mBuf;
93         uint64_t mCommitTime;
94         sem_t *const mReaderSem;
95
96         // Intentionally unimplemented
97         Buffer(const Buffer &);
98         Buffer &operator=(const Buffer &);
99 };
100
101 #endif // BUFFER_H