-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtaskinfo.cpp
137 lines (114 loc) · 4.29 KB
/
taskinfo.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <algorithm>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#ifndef NO_REPORT
#include <iomanip>
#endif
#include "server.h"
// Creates the object by initializing some default values. Since the default values reflect an unused object, it adds itself
// to the free list.
TaskInfo::TaskInfo(TaskPool& taskPool, taskhandle_t h, taskid_t id) :
boot(now()), taskPool_(taskPool), handle_(h), id_(id),
pendingRequests(0), maxPendingRequests(0), printPendingWarning(true)
{
}
int64_t TaskInfo::connectedTime() const
{
return now() - boot;
}
#ifndef DEBUG
#define SZ_ATTR __attribute__((unused))
#else
#define SZ_ATTR
#endif
bool TaskInfo::decrementPendingRequests()
{
if (pendingRequests > 0) {
--pendingRequests;
return true;
} else
return false;
}
void TaskInfo::testPendingRequestsAndIncrement()
{
if (pendingRequests < maxPendingRequestsAccepted) {
if (needsToBeThrottled() && ++pendingRequests > maxPendingRequests)
maxPendingRequests = pendingRequests;
} else if (printPendingWarning) {
// Print a single pending warning for a task
printPendingWarning = false;
syslog(LOG_WARNING, "Warning: %s has %d pending requests", handle_.str(), pendingRequests);
}
}
#ifndef NO_REPORT
void TaskInfo::report(std::ostream& os) const
{
os <<
"\t\t<table class=\"dump\">\n"
"\t\t\t<colgroup>\n"
"\t\t\t\t<col class=\"label\"/>\n"
"\t\t\t\t<col/>\n"
"\t\t\t</colgroup>\n"
"\t\t\t<thead>\n";
os <<
"\t\t\t<tr><td colspan=\"2\">Task " << handle().str();
os <<
' ' << ((acceptsUsm() || acceptsRequests()) ? "*RUM* " : "") << "(0x" <<
std::setw(8) << std::setfill('0') << std::hex << handle().raw() << ") " << name() << "</td></tr>\n"
"\t\t\t</thead>\n";
os <<
"\t\t\t<tbody>\n"
"\t\t\t<tr class=\"even\"><td class=\"label\">ID</td><td>" << std::dec << id().raw() << "</td></tr>\n"
"\t\t\t<tr><td class=\"label\">PID</td><td>" << pid() << "</td></tr>\n" <<
"\t\t\t<tr class=\"even\"><td class=\"label\">Pending Request</td><td>" << pendingRequests << "</td></tr>\n" <<
"\t\t\t<tr><td class=\"label\">Max Pending Requests</td><td>" << maxPendingRequests << "</td></tr>\n" <<
"\t\t\t<tr class=\"even\"><td class=\"label\">USMs Transmitted</td><td>" << (uint32_t) stats.usmXmt << "</td></tr>\n" <<
"\t\t\t<tr><td class=\"label\">Requests Transmitted</td><td>" << (uint32_t) stats.reqXmt << "</td></tr>\n" <<
"\t\t\t<tr class=\"even\"><td class=\"label\">Replies Transmitted</td><td>" << (uint32_t) stats.rpyXmt << "</td></tr>\n" <<
"\t\t\t<tr><td class=\"label\">USMs Received</td><td>" << (uint32_t) stats.usmRcv << "</td></tr>\n" <<
"\t\t\t<tr class=\"even\"><td class=\"label\">Requests Received</td><td>" << (uint32_t) stats.reqRcv << "</td></tr>\n" <<
"\t\t\t<tr><td class=\"label\">Replies Received</td><td>" << (uint32_t) stats.rpyRcv << "</td></tr>\n" <<
"\t\t\t<tr class=\"even\"><td class=\"label\">Dropped Packets</td><td>" << (uint32_t) stats.lostPkt << "</td></tr>\n" <<
"\t\t\t<tr><td class=\"label\">Connected</td><td>";
printElapsedTime(os, now() - boot);
os << "</td></tr>\n";
for (size_t ii = 0; ii < totalProp(); ++ii)
os << "\t\t\t<tr" << (ii % 2 ? "" : " class=\"even\"") << "><td class=\"label\">" << propName(ii) <<
"</td><td>" << propVal(ii) << "</td></tr>\n";
os << "\t\t\t</tbody>\n" << std::hex;
if (!requests.empty()) {
os << "\t\t\t<thead>\n"
"\t\t\t<tr><td colspan=\"2\">Requests</td></tr>\n"
"\t\t\t</thead>\n"
"\t\t\t<tbody>\n"
"\t\t\t<tr><td colspan=\"2\"><tt>";
for (auto ii = requests.begin(); ii != requests.end(); ++ii) {
if (ii != requests.begin())
os << ", ";
os << "0x" << std::setw(4) << std::setfill('0') << (*ii).raw();
}
os << "</tt></td></tr>\n"
"\t\t\t</tbody>\n";
}
if (!replies.empty()) {
os << "\t\t\t<thead>\n"
"\t\t\t<tr><td colspan=\"2\">Replies</td></tr>\n"
"\t\t\t</thead>\n"
"\t\t\t<tbody>\n"
"\t\t\t<tr><td colspan=\"2\"><tt>";
for (auto ii = replies.begin(); ii != replies.end(); ++ii) {
if (ii != replies.begin())
os << ", ";
os << "0x" << std::setw(4) << std::setfill('0') << (*ii).raw();
}
os << "</tt></td></tr>\n"
"\t\t\t</tbody>\n";
}
os << std::setw(0) << std::setfill(' ') << std::dec << "\t\t</table>\n"; // \t\t</div>";
}
#endif
// Local Variables:
// mode:c++
// fill-column:125
// End: