]>
Commit | Line | Data |
---|---|---|
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 | ||
23 | typedef 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 | */ | |
33 | struct 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 | ||
41 | static inline void | |
42 | versions_set_remove_version(struct versions *versions, ovs_version_t version) | |
43 | { | |
44 | atomic_store_relaxed(&versions->remove_version, version); | |
45 | } | |
46 | ||
47 | static inline bool | |
48 | versions_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 | ||
61 | static inline bool | |
62 | versions_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 */ |