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
|
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include "ConnectionHistory.hpp"
#include "../../server/tracy_pdqsort.h"
#include "../../server/TracyStorage.hpp"
ConnectionHistory::ConnectionHistory()
: m_fn( tracy::GetSavePath( "connection.history" ) )
{
FILE* f = fopen( m_fn.c_str(), "rb" );
if( !f ) return;
uint64_t sz;
fread( &sz, 1, sizeof( sz ), f );
for( uint64_t i=0; i<sz; i++ )
{
uint64_t ssz, cnt;
fread( &ssz, 1, sizeof( ssz ), f );
assert( ssz < 1024 );
char tmp[1024];
fread( tmp, 1, ssz, f );
fread( &cnt, 1, sizeof( cnt ), f );
m_connHistMap.emplace( std::string( tmp, tmp+ssz ), cnt );
}
fclose( f );
Rebuild();
}
ConnectionHistory::~ConnectionHistory()
{
FILE* f = fopen( m_fn.c_str(), "wb" );
if( !f ) return;
uint64_t sz = uint64_t( m_connHistMap.size() );
fwrite( &sz, 1, sizeof( uint64_t ), f );
for( auto& v : m_connHistMap )
{
sz = uint64_t( v.first.size() );
fwrite( &sz, 1, sizeof( uint64_t ), f );
fwrite( v.first.c_str(), 1, sz, f );
fwrite( &v.second, 1, sizeof( v.second ), f );
}
fclose( f );
}
void ConnectionHistory::Rebuild()
{
std::vector<std::unordered_map<std::string, uint64_t>::const_iterator> vec;
vec.reserve( m_connHistMap.size() );
for( auto it = m_connHistMap.begin(); it != m_connHistMap.end(); ++it )
{
vec.emplace_back( it );
}
tracy::pdqsort_branchless( vec.begin(), vec.end(), []( const auto& lhs, const auto& rhs ) { return lhs->second > rhs->second; } );
std::swap( m_connHistVec, vec );
}
void ConnectionHistory::Count( const char* name )
{
std::string addr( name );
auto it = m_connHistMap.find( addr );
if( it != m_connHistMap.end() )
{
it->second++;
}
else
{
m_connHistMap.emplace( std::move( addr ), 1 );
}
Rebuild();
}
void ConnectionHistory::Erase( size_t idx )
{
assert( idx < m_connHistVec.size() );
m_connHistMap.erase( m_connHistVec[idx] );
Rebuild();
}
|