Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ConnectionHistory.cpp « src « profiler - github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 074426b6e3c8ff3e0b48dd6159635b815b6cc887 (plain)
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();
}