aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src/vespa/searchcore/proton/server/disk_mem_usage_forwarder.cpp
blob: d9e2d37903ec638922a99c942525bbd32097d41b (plain) (blame)
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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "disk_mem_usage_forwarder.h"
#include <vespa/vespalib/util/lambdatask.h>

using vespalib::makeLambdaTask;

namespace proton {

DiskMemUsageForwarder::DiskMemUsageForwarder(searchcorespi::index::IThreadService &executor)
    : IDiskMemUsageNotifier(),
      IDiskMemUsageListener(),
      _executor(executor),
      _listeners(),
      _state()
{ }

DiskMemUsageForwarder::~DiskMemUsageForwarder() = default;

void
DiskMemUsageForwarder::addDiskMemUsageListener(IDiskMemUsageListener *listener)
{
    std::lock_guard guard(_lock);
    _listeners.push_back(listener);
    listener->notifyDiskMemUsage(_state);
}

void
DiskMemUsageForwarder::removeDiskMemUsageListener(IDiskMemUsageListener *listener)
{
    std::lock_guard guard(_lock);
    for (auto itr = _listeners.begin(); itr != _listeners.end(); ++itr) {
        if (*itr == listener) {
            _listeners.erase(itr);
            break;
        }
    }
}

void
DiskMemUsageForwarder::notifyDiskMemUsage(DiskMemUsageState state)
{
    _executor.execute(makeLambdaTask([this, state]() { forward(state); }));
}


void
DiskMemUsageForwarder::forward(DiskMemUsageState state)
{
    std::lock_guard guard(_lock);
    if (_state != state) {
        _state = state;
        for (const auto &listener : _listeners) {
            listener->notifyDiskMemUsage(state);
        }
    }
}

} // namespace proton