summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2/RoutingTable.h
blob: 805f0a963db0c5ec8b7734b083b4667923b46e7f (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
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//

#ifndef ICE_ROUTING_TABLE_H
#define ICE_ROUTING_TABLE_H

#include <Ice/Ice.h>
#include <Ice/ObserverHelper.h>
#include <IceUtil/Mutex.h>

#include <Glacier2/ProxyVerifier.h>
#include <Glacier2/Instrumentation.h>

#include <list>

namespace Glacier2
{

class RoutingTable final
{
public:

    RoutingTable(std::shared_ptr<Ice::Communicator>, std::shared_ptr<ProxyVerifier>);

    void destroy();

    std::shared_ptr<Glacier2::Instrumentation::SessionObserver>
    updateObserver(const std::shared_ptr<Glacier2::Instrumentation::RouterObserver>&,
                   const std::string&, const std::shared_ptr<Ice::Connection>&);

    // Returns evicted proxies.
    Ice::ObjectProxySeq add(const Ice::ObjectProxySeq&, const Ice::Current&);
    std::shared_ptr<Ice::ObjectPrx> get(const Ice::Identity&); // Returns null if no proxy can be found.

private:

    const std::shared_ptr<Ice::Communicator> _communicator;
    const int _traceLevel;
    const int _maxSize;
    const std::shared_ptr<ProxyVerifier> _verifier;

    struct EvictorEntry;
    using EvictorMap = std::map<Ice::Identity, std::shared_ptr<EvictorEntry>>;
    using EvictorQueue = std::list<EvictorMap::iterator>;

    friend struct EvictorEntry;
    struct EvictorEntry
    {
        std::shared_ptr<Ice::ObjectPrx> proxy;
        EvictorQueue::iterator pos;
    };

    EvictorMap _map;
    EvictorQueue _queue;

    IceInternal::ObserverHelperT<Glacier2::Instrumentation::SessionObserver> _observer;

    std::mutex _mutex;
};

}

#endif