Cogs.Core
ThrottledConsumer.cpp
1#include "ThrottledConsumer.h"
2
3#include "../HashSequence.h"
4#include "../Platform/Timer.h"
5#include "../Platform/Timer.h"
6
7namespace {
8 bool enabled = false; // Call setEnabled to control whether throttling is enabled or not.
9}
10
17 enabled = enable;
18}
19
26void Cogs::Logging::ThrottledConsumer::consumeMessage(const char* source, Category category, uint32_t /*errorNumber*/, const char* message, const char* filename, int lineNumber) {
27 assert(filename);
28
29 messagesMutex.lock();
30 Message& msg = messages[hashSequence(source, message, filename, lineNumber)];
31
32 if (!msg.outputTime) {
33 msg.message = message;
34 msg.source = source;
35 msg.file = filename;
36 msg.line = lineNumber;
37 msg.category = category;
38 }
39 msg.count++;
40 messagesMutex.unlock();
41
42 flush(!enabled);
43}
44
49 int64_t now = Cogs::Timer::currentTimeMilliseconds();
50 char buffer[64];
51 std::string prefix;
52 time_t seconds = now / 1000;
53 char milliseconds[64];
54
55 strftime(buffer, sizeof(buffer), "%H:%M:%S", localtime(&seconds));
56 snprintf(milliseconds, sizeof(milliseconds), ":%03d", static_cast<int>(now % 1000));
57 strcat(buffer, milliseconds);
58
59 LockGuard lock(messagesMutex);
60
61 for (auto i = messages.begin(), e = messages.end(); i != e; ) {
62 Message& message = i->second;
63
64 if (flushAll || (message.outputTime < now)) {
65 if (message.count) {
66 prefix = "[";
67 prefix += buffer;
68
69 if (message.count > 1) {
70 prefix += " *";
71 prefix += std::to_string(message.count);
72 }
73 prefix += "]";
74
75 outputMessage(prefix, message);
76
77 message.outputTime = flushAll ? 0 : now + (message.count * 100);
78 message.count = 0;
79 }
80 else {
81 i = messages.erase(i);
82 continue;
83 }
84 }
85 ++i;
86 }
87}
void flush(bool flushAll=true)
Flushes some or all messages currently queued and awaiting a suitable time to be output.
virtual void consumeMessage(const char *source, Category category, uint32_t errorNumber, const char *message, const char *filename, int lineNumber) override
Consumes a message being sent through the logging system.
static void setEnabled(bool enable)
Enables or disables throttling of messages.
Category
Logging categories used to filter log messages.
Definition: LogManager.h:31
constexpr size_t hashSequence(const T &t, const U &u)
Hash the last two items in a sequence of objects.
Definition: HashSequence.h:8
int line
Line number this message is from.
int count
Number of times this message has been received since it was last output.
std::string message
Message to be output.
int64_t outputTime
Time at which this message can be next output.
const char * file
Name of file that generated this message.
std::string source
Source of this message.
Category category
Category to which this message belongs.