2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00
ovs/lib/versions.h
Fangrui Song 71ca8393b7 treewide: Remove uses of ATOMIC_VAR_INIT.
ATOMIC_VAR_INIT has a trivial definition
`#define ATOMIC_VAR_INIT(value) (value)`,
is deprecated in C17/C++20, and will be removed in newer standards in
newer GCC/Clang (e.g. https://reviews.llvm.org/D144196).

Signed-off-by: Fangrui Song <maskray@google.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
2023-03-06 19:27:19 +01:00

75 lines
2.4 KiB
C

/*
* Copyright (c) 2016 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef VERSIONS_H
#define VERSIONS_H 1
#include "ovs-atomic.h"
#include "openvswitch/type-props.h"
typedef uint64_t ovs_version_t;
#define OVS_VERSION_MIN 0 /* Default version number to use. */
#define OVS_VERSION_MAX (TYPE_MAXIMUM(ovs_version_t) - 1)
#define OVS_VERSION_NOT_REMOVED TYPE_MAXIMUM(ovs_version_t)
/*
* OVS_VERSION_NOT_REMOVED has a special meaning for 'remove_version',
* meaning that the rule has been added but not yet removed.
*/
struct versions {
ovs_version_t add_version; /* Version object was added in. */
ATOMIC(ovs_version_t) remove_version; /* Version object is removed in. */
};
#define VERSIONS_INITIALIZER(ADD, REMOVE) \
(struct versions){ ADD, REMOVE }
static inline void
versions_set_remove_version(struct versions *versions, ovs_version_t version)
{
atomic_store_relaxed(&versions->remove_version, version);
}
static inline bool
versions_visible_in_version(const struct versions *versions,
ovs_version_t version)
{
ovs_version_t remove_version;
/* C11 does not want to access an atomic via a const object pointer. */
atomic_read_relaxed(&CONST_CAST(struct versions *,
versions)->remove_version,
&remove_version);
return versions->add_version <= version && version < remove_version;
}
static inline bool
versions_is_eventually_invisible(const struct versions *versions)
{
ovs_version_t remove_version;
/* C11 does not want to access an atomic via a const object pointer. */
atomic_read_relaxed(&CONST_CAST(struct versions *,
versions)->remove_version,
&remove_version);
return remove_version < OVS_VERSION_NOT_REMOVED;
}
#endif /* VERSIONS_H */