]> git.proxmox.com Git - mirror_ovs.git/blame - lib/versions.h
ovsdb-idl: Fix iteration over tracked rows with no actual data.
[mirror_ovs.git] / lib / versions.h
CommitLineData
44e0c35d
JR
1/*
2 * Copyright (c) 2016 Nicira, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef VERSIONS_H
18#define VERSIONS_H 1
19
20#include "ovs-atomic.h"
21#include "openvswitch/type-props.h"
22
23typedef uint64_t ovs_version_t;
24
25#define OVS_VERSION_MIN 0 /* Default version number to use. */
26#define OVS_VERSION_MAX (TYPE_MAXIMUM(ovs_version_t) - 1)
27#define OVS_VERSION_NOT_REMOVED TYPE_MAXIMUM(ovs_version_t)
28
29/*
30 * OVS_VERSION_NOT_REMOVED has a special meaning for 'remove_version',
31 * meaning that the rule has been added but not yet removed.
32 */
33struct versions {
34 ovs_version_t add_version; /* Version object was added in. */
35 ATOMIC(ovs_version_t) remove_version; /* Version object is removed in. */
36};
37
38#define VERSIONS_INITIALIZER(ADD, REMOVE) \
39 (struct versions){ ADD, ATOMIC_VAR_INIT(REMOVE) }
40
41static inline void
42versions_set_remove_version(struct versions *versions, ovs_version_t version)
43{
44 atomic_store_relaxed(&versions->remove_version, version);
45}
46
47static inline bool
48versions_visible_in_version(const struct versions *versions,
49 ovs_version_t version)
50{
51 ovs_version_t remove_version;
52
53 /* C11 does not want to access an atomic via a const object pointer. */
54 atomic_read_relaxed(&CONST_CAST(struct versions *,
55 versions)->remove_version,
56 &remove_version);
57
58 return versions->add_version <= version && version < remove_version;
59}
60
61static inline bool
62versions_is_eventually_invisible(const struct versions *versions)
63{
64 ovs_version_t remove_version;
65
66 /* C11 does not want to access an atomic via a const object pointer. */
67 atomic_read_relaxed(&CONST_CAST(struct versions *,
68 versions)->remove_version,
69 &remove_version);
70
71 return remove_version < OVS_VERSION_NOT_REMOVED;
72}
73
74#endif /* VERSIONS_H */