diff --git a/panda/src/pstatclient/pStatClientImpl.cxx b/panda/src/pstatclient/pStatClientImpl.cxx index 4031a18b7e..849a10a53f 100644 --- a/panda/src/pstatclient/pStatClientImpl.cxx +++ b/panda/src/pstatclient/pStatClientImpl.cxx @@ -184,6 +184,8 @@ new_frame(int thread_index) { } float frame_start = get_real_time(); + int frame_number = -1; + PStatFrameData frame_data; if (!pthread->_frame_data.is_empty()) { // Collector 0 is the whole frame. @@ -201,7 +203,8 @@ new_frame(int thread_index) { pthread->_frame_data.add_level(i, ptd._level); } } - transmit_frame_data(thread_index); + pthread->_frame_data.swap(frame_data); + frame_number = pthread->_frame_number; } pthread->_frame_data.clear(); @@ -211,6 +214,10 @@ new_frame(int thread_index) { // Also record the time for the PStats operation itself. int pstats_index = PStatClient::_pstats_pcollector.get_index(); _client->start(pstats_index, thread_index, frame_start); + + if (frame_number != -1) { + transmit_frame_data(thread_index, frame_number, frame_data); + } _client->stop(pstats_index, thread_index, get_real_time()); } @@ -221,7 +228,8 @@ new_frame(int thread_index) { // transmit the latest data to the PStatServer. //////////////////////////////////////////////////////////////////// void PStatClientImpl:: -transmit_frame_data(int thread_index) { +transmit_frame_data(int thread_index, int frame_number, + const PStatFrameData &frame_data) { nassertv(thread_index >= 0 && thread_index < _client->_num_threads); PStatClient::InternalThread *thread = _client->get_thread_ptr(thread_index); if (_is_connected && thread->_is_active) { @@ -243,11 +251,11 @@ transmit_frame_data(int thread_index) { datagram.add_uint8(0); datagram.add_uint16(thread_index); - datagram.add_uint32(thread->_frame_number); + datagram.add_uint32(frame_number); bool sent; - if (!thread->_frame_data.write_datagram(datagram, _client)) { + if (!frame_data.write_datagram(datagram, _client)) { // Too many events to fit in a single datagram. Maybe it was // a long frame load or something. Just drop the datagram. sent = false; diff --git a/panda/src/pstatclient/pStatClientImpl.h b/panda/src/pstatclient/pStatClientImpl.h index e80d64c16f..d6009b1f2f 100644 --- a/panda/src/pstatclient/pStatClientImpl.h +++ b/panda/src/pstatclient/pStatClientImpl.h @@ -74,7 +74,8 @@ public: void new_frame(int thread_index); private: - void transmit_frame_data(int thread_index); + void transmit_frame_data(int thread_index, int frame_number, + const PStatFrameData &frame_data); void transmit_control_data(); diff --git a/panda/src/pstatclient/pStatFrameData.I b/panda/src/pstatclient/pStatFrameData.I index 6ac2cc5526..52cd0f29af 100644 --- a/panda/src/pstatclient/pStatFrameData.I +++ b/panda/src/pstatclient/pStatFrameData.I @@ -58,6 +58,18 @@ clear() { _level_data.clear(); } +//////////////////////////////////////////////////////////////////// +// Function: PStatFrameData::swap +// Access: Public +// Description: Exchanges the data in this object with the data in +// the other. +//////////////////////////////////////////////////////////////////// +INLINE void PStatFrameData:: +swap(PStatFrameData &other) { + _time_data.swap(other._time_data); + _level_data.swap(other._level_data); +} + //////////////////////////////////////////////////////////////////// // Function: PStatFrameData::add_start // Access: Public diff --git a/panda/src/pstatclient/pStatFrameData.h b/panda/src/pstatclient/pStatFrameData.h index 1efebd1183..490f9a70de 100644 --- a/panda/src/pstatclient/pStatFrameData.h +++ b/panda/src/pstatclient/pStatFrameData.h @@ -39,6 +39,7 @@ public: INLINE bool is_level_empty() const; INLINE bool is_empty() const; INLINE void clear(); + INLINE void swap(PStatFrameData &other); INLINE void add_start(int index, float time); INLINE void add_stop(int index, float time);