40 set_tcp_header_size(4);
41 _writer.set_tcp_header_size(4);
44 _monitor->set_client_data(_client_data);
73 _tcp_connection = tcp_connection;
77 _udp_connection = _manager->open_UDP_connection(_udp_port);
78 while (_udp_connection.is_null()) {
81 _udp_connection = _manager->open_UDP_connection(_udp_port);
95 _client_data->_is_alive =
false;
96 _monitor->lost_connection();
99 _manager->close_connection(_tcp_connection);
100 _manager->close_connection(_udp_connection);
101 _tcp_connection.clear();
102 _udp_connection.clear();
111 dequeue_frame_data();
126 std::string PStatReader::
128 if (_hostname.empty()) {
130 if (_hostname.empty()) {
131 _hostname =
"unknown";
143 message._type = PStatServerControlMessage::T_hello;
144 message._server_hostname = get_hostname();
145 message._server_progname = _monitor->get_monitor_name();
146 message._udp_port = _udp_port;
150 _writer.
send(datagram, _tcp_connection);
159 Connection *connection = datagram.get_connection();
161 if (connection == _tcp_connection) {
163 if (message.
decode(datagram, _client_data)) {
164 handle_client_control_message(message);
166 }
else if (message._type == PStatClientControlMessage::T_datagram) {
167 handle_client_udp_data(datagram);
170 nout <<
"Got unexpected message from client.\n";
173 }
else if (connection == _udp_connection) {
174 handle_client_udp_data(datagram);
177 nout <<
"Got datagram from unexpected socket.\n";
187 switch (message._type) {
188 case PStatClientControlMessage::T_hello:
190 _client_data->set_version(message._major_version, message._minor_version);
194 if (message._major_version != server_major_version ||
195 (message._major_version == server_major_version &&
196 message._minor_version > server_minor_version)) {
197 _monitor->bad_version(message._client_hostname, message._client_progname,
198 message._major_version, message._minor_version,
199 server_major_version, server_minor_version);
202 _monitor->hello_from(message._client_hostname, message._client_progname);
207 case PStatClientControlMessage::T_define_collectors:
209 for (
int i = 0; i < (int)message._collectors.size(); i++) {
210 _client_data->add_collector(message._collectors[i]);
211 _monitor->new_collector(message._collectors[i]->_index);
216 case PStatClientControlMessage::T_define_threads:
218 for (
int i = 0; i < (int)message._names.size(); i++) {
219 int thread_index = message._first_thread_index + i;
220 std::string name = message._names[i];
221 _client_data->define_thread(thread_index, name);
222 _monitor->new_thread(thread_index);
228 nout <<
"Invalid control message received from client.\n";
237 handle_client_udp_data(
const Datagram &datagram) {
238 if (!_monitor->is_client_known()) {
248 if (_client_data->is_at_least(2, 1)) {
250 int initial_byte = source.get_uint8();
251 nassertv(initial_byte == 0);
254 if (!_queued_frame_data.
full()) {
256 data._thread_index = source.get_uint16();
257 data._frame_number = source.get_uint32();
259 data._frame_data->read_datagram(source, _client_data);
272 dequeue_frame_data() {
273 while (!_queued_frame_data.
empty()) {
274 const FrameData &data = _queued_frame_data.
front();
275 nassertv(_client_data !=
nullptr);
278 int num_levels = data._frame_data->get_num_levels();
279 for (
int i = 0; i < num_levels; i++) {
280 int collector_index = data._frame_data->get_level_collector(i);
281 if (!_client_data->get_collector_has_level(collector_index, data._thread_index)) {
283 _client_data->set_collector_has_level(collector_index, data._thread_index,
true);
284 _monitor->new_collector(collector_index);
288 _client_data->record_new_frame(data._thread_index,
291 _monitor->new_data(data._thread_index, data._frame_number);