2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-23 14:57:06 +00:00
Files
openvswitch/lib/versions.h
Jarno Rajahalme 44e0c35d98 lib: Separate versioning to its own module.
Separate rule versioning to lib/versions.h to make it easier to use
versioning for other data types.

Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
Acked-by: Ben Pfaff <blp@ovn.org>
2016-07-29 16:52:01 -07: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, ATOMIC_VAR_INIT(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 */