mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
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>
75 lines
2.4 KiB
C
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 */
|