1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/*
* 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 */
|