blob: edfc046e7406b94dd725e432fa67eea9dadfb133 [file] [log] [blame]
Neale Ranns812ed392017-10-16 04:20:13 -07001/*
2 * Copyright (c) 2017 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <algorithm>
17
Neale Rannsf7564012018-03-20 16:30:51 -070018#include "vom/logger.hpp"
Neale Ranns812ed392017-10-16 04:20:13 -070019#include "vom/om.hpp"
20
21namespace VOM {
22client_db* OM::m_db;
23
24std::unique_ptr<OM::listener_list> OM::m_listeners;
25
26/**
27 * Initialse the connection to VPP
28 */
29void
30OM::init()
31{
32 m_db = new client_db();
33}
34
35void
36OM::mark(const client_db::key_t& key)
37{
38 /*
39 * Find if the object already stored on behalf of this key.
40 * and mark them stale
41 */
42 object_ref_list& objs = m_db->find(key);
43
44 auto mark_obj = [](const object_ref& oref) { oref.mark(); };
45
46 std::for_each(objs.begin(), objs.end(), mark_obj);
47}
48
49void
50OM::sweep(const client_db::key_t& key)
51{
52 /*
Neale Rannsfd920602017-11-23 12:15:00 -080053 * Find if the object already stored on behalf of this key.
54 * and mark them stale
55 */
Neale Ranns812ed392017-10-16 04:20:13 -070056 object_ref_list& objs = m_db->find(key);
57
58 for (auto it = objs.begin(); it != objs.end();) {
59 if (it->stale()) {
60 it = objs.erase(it);
61 } else {
62 ++it;
63 }
64 }
65
66 HW::write();
67}
68
69void
70OM::remove(const client_db::key_t& key)
71{
72 /*
Neale Rannsfd920602017-11-23 12:15:00 -080073 * Simply reset the list for this key. This will desctruct the
74 * object list and shared_ptrs therein. When the last shared_ptr
75 * goes the objects desctructor is called and the object is
76 * removed from OM
77 */
Neale Ranns812ed392017-10-16 04:20:13 -070078 m_db->flush(key);
79
80 HW::write();
81}
82
83void
84OM::replay()
85{
Neale Rannsf7564012018-03-20 16:30:51 -070086 VOM_LOG(log_level_t::INFO) << "replay";
Neale Ranns812ed392017-10-16 04:20:13 -070087 /*
Neale Rannsfd920602017-11-23 12:15:00 -080088 * the listeners are sorted in dependency order
89 */
Neale Ranns812ed392017-10-16 04:20:13 -070090 for (listener* l : *m_listeners) {
91 l->handle_replay();
Mohsin Kazmib5eb3b12018-02-26 18:36:17 +010092 HW::write();
Neale Ranns812ed392017-10-16 04:20:13 -070093 }
Neale Ranns812ed392017-10-16 04:20:13 -070094}
95
96void
97OM::dump(const client_db::key_t& key, std::ostream& os)
98{
99 m_db->dump(key, os);
100}
101
102void
103OM::dump(std::ostream& os)
104{
105 m_db->dump(os);
106}
107
108void
109OM::populate(const client_db::key_t& key)
110{
Neale Rannsf7564012018-03-20 16:30:51 -0700111 VOM_LOG(log_level_t::INFO) << "populate";
112
Neale Ranns812ed392017-10-16 04:20:13 -0700113 /*
Neale Rannsfd920602017-11-23 12:15:00 -0800114 * the listeners are sorted in dependency order
115 */
Neale Ranns812ed392017-10-16 04:20:13 -0700116 for (listener* l : *m_listeners) {
117 l->handle_populate(key);
118 }
119
120 /*
Neale Rannsfd920602017-11-23 12:15:00 -0800121 * once we have it all, mark it stale.
122 */
Neale Ranns812ed392017-10-16 04:20:13 -0700123 mark(key);
124}
125
126bool
127OM::register_listener(OM::listener* listener)
128{
129 if (!m_listeners) {
130 m_listeners.reset(new listener_list);
131 }
132
133 m_listeners->insert(listener);
134
135 return (true);
136}
137
138OM::mark_n_sweep::mark_n_sweep(const client_db::key_t& key)
139 : m_key(key)
140{
141 OM::mark(m_key);
142}
143
144OM::mark_n_sweep::~mark_n_sweep()
145{
146 OM::sweep(m_key);
147}
148}
149
150/*
151 * fd.io coding-style-patch-verification: ON
152 *
153 * Local Variables:
154 * eval: (c-set-style "mozilla")
155 * End:
156 */