Ringbuffer tail is not updated by kernel.

This commit is contained in:
Bartosz Taudul 2021-06-03 01:14:44 +02:00
parent eb38640114
commit 483d31c1f4
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -6,8 +6,8 @@ class RingBuffer
{ {
public: public:
RingBuffer( int fd, int id ) RingBuffer( int fd, int id )
: m_fd( fd ) : m_id( id )
, m_id( id ) , m_fd( fd )
{ {
const auto pageSize = uint32_t( getpagesize() ); const auto pageSize = uint32_t( getpagesize() );
assert( Size >= pageSize ); assert( Size >= pageSize );
@ -24,6 +24,7 @@ public:
m_metadata = (perf_event_mmap_page*)mapAddr; m_metadata = (perf_event_mmap_page*)mapAddr;
assert( m_metadata->data_offset == pageSize ); assert( m_metadata->data_offset == pageSize );
m_buffer = ((char*)mapAddr) + pageSize; m_buffer = ((char*)mapAddr) + pageSize;
m_tail = m_metadata->data_tail;
} }
~RingBuffer() ~RingBuffer()
@ -61,12 +62,12 @@ public:
bool HasData() const bool HasData() const
{ {
const auto head = LoadHead(); const auto head = LoadHead();
return head > m_metadata->data_tail; return head > m_tail;
} }
void Read( void* dst, uint64_t offset, uint64_t cnt ) void Read( void* dst, uint64_t offset, uint64_t cnt )
{ {
auto src = ( m_metadata->data_tail + offset ) % Size; auto src = ( m_tail + offset ) % Size;
if( src + cnt <= Size ) if( src + cnt <= Size )
{ {
memcpy( dst, m_buffer + src, cnt ); memcpy( dst, m_buffer + src, cnt );
@ -81,7 +82,8 @@ public:
void Advance( uint64_t cnt ) void Advance( uint64_t cnt )
{ {
StoreTail( m_metadata->data_tail + cnt ); m_tail += cnt;
StoreTail();
} }
bool CheckTscCaps() const bool CheckTscCaps() const
@ -104,17 +106,18 @@ private:
return std::atomic_load_explicit( (const volatile std::atomic<uint64_t>*)&m_metadata->data_head, std::memory_order_acquire ); return std::atomic_load_explicit( (const volatile std::atomic<uint64_t>*)&m_metadata->data_head, std::memory_order_acquire );
} }
void StoreTail( uint64_t tail ) void StoreTail()
{ {
std::atomic_store_explicit( (volatile std::atomic<uint64_t>*)&m_metadata->data_tail, tail, std::memory_order_release ); std::atomic_store_explicit( (volatile std::atomic<uint64_t>*)&m_metadata->data_tail, m_tail, std::memory_order_release );
} }
perf_event_mmap_page* m_metadata; uint64_t m_tail;
char* m_buffer; char* m_buffer;
int m_id;
perf_event_mmap_page* m_metadata;
size_t m_mapSize; size_t m_mapSize;
int m_fd; int m_fd;
int m_id;
}; };
} }