X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Ftag.c;h=13d182925eb3f5a0f4570a8fb717efb3035a5bcf;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=b45bcd55d2bf7ce96814bbe9ccafb8d8715503a4;hpb=b63e3bbc18c459073a4b83a26b17c53f34f3dcf2;p=sliver-openvswitch.git diff --git a/lib/tag.c b/lib/tag.c index b45bcd55d..13d182925 100644 --- a/lib/tag.c +++ b/lib/tag.c @@ -16,10 +16,6 @@ #include #include "tag.h" -#include - -#define N_TAG_BITS (CHAR_BIT * sizeof(tag_type)) -BUILD_ASSERT_DECL(IS_POW2(N_TAG_BITS)); #define LOG2_N_TAG_BITS (N_TAG_BITS == 32 ? 5 : N_TAG_BITS == 64 ? 6 : 0) BUILD_ASSERT_DECL(LOG2_N_TAG_BITS > 0); @@ -37,3 +33,32 @@ tag_create_deterministic(uint32_t seed) y += y >= x; return (1u << x) | (1u << y); } + +/* Initializes 'tracker'. */ +void +tag_tracker_init(struct tag_tracker *tracker) +{ + memset(tracker, 0, sizeof *tracker); +} + +/* Adds 'add' to '*tags' and records the bits added in 'tracker'. */ +void +tag_tracker_add(struct tag_tracker *tracker, tag_type *tags, tag_type add) +{ + *tags |= add; + for (; add; add = zero_rightmost_1bit(add)) { + tracker->counts[rightmost_1bit_idx(add)]++; + } +} + +/* Removes 'sub' from 'tracker' and unsets any bits in '*tags' that no + * remaining tag includes. */ +void +tag_tracker_subtract(struct tag_tracker *tracker, tag_type *tags, tag_type sub) +{ + for (; sub; sub = zero_rightmost_1bit(sub)) { + if (!--tracker->counts[rightmost_1bit_idx(sub)]) { + *tags &= ~rightmost_1bit(sub); + } + } +}