]>
git.proxmox.com Git - mirror_ovs.git/blob - lib/id-pool.c
2 * Copyright (c) 2014 Nicira, Inc.
3 * Copyright (c) 2014 Netronome.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 #include "openvswitch/hmap.h"
24 struct hmap_node node
;
30 uint32_t base
; /* IDs in the range of [base, base + n_ids). */
31 uint32_t n_ids
; /* Total number of ids in the pool. */
32 uint32_t next_free_id
; /* Possible next free id. */
35 static void id_pool_init(struct id_pool
*pool
,
36 uint32_t base
, uint32_t n_ids
);
37 static void id_pool_uninit(struct id_pool
*pool
);
38 static struct id_node
*id_pool_find(struct id_pool
*pool
, uint32_t id
);
41 id_pool_create(uint32_t base
, uint32_t n_ids
)
45 pool
= xmalloc(sizeof *pool
);
46 id_pool_init(pool
, base
, n_ids
);
52 id_pool_destroy(struct id_pool
*pool
)
61 id_pool_init(struct id_pool
*pool
, uint32_t base
, uint32_t n_ids
)
65 pool
->next_free_id
= base
;
66 hmap_init(&pool
->map
);
70 id_pool_uninit(struct id_pool
*pool
)
72 struct id_node
*id_node
;
74 HMAP_FOR_EACH_POP(id_node
, node
, &pool
->map
) {
78 hmap_destroy(&pool
->map
);
81 static struct id_node
*
82 id_pool_find(struct id_pool
*pool
, uint32_t id
)
85 struct id_node
*id_node
;
87 hash
= hash_int(id
, 0);
88 HMAP_FOR_EACH_WITH_HASH(id_node
, node
, hash
, &pool
->map
) {
89 if (id
== id_node
->id
) {
97 id_pool_add(struct id_pool
*pool
, uint32_t id
)
99 struct id_node
*id_node
= xmalloc(sizeof *id_node
);
103 hash
= hash_int(id
, 0);
104 hmap_insert(&pool
->map
, &id_node
->node
, hash
);
108 id_pool_alloc_id(struct id_pool
*pool
, uint32_t *id_
)
112 if (pool
->n_ids
== 0) {
116 if (!(id_pool_find(pool
, pool
->next_free_id
))) {
117 id
= pool
->next_free_id
;
121 for(id
= pool
->base
; id
< pool
->base
+ pool
->n_ids
; id
++) {
122 if (!id_pool_find(pool
, id
)) {
131 id_pool_add(pool
, id
);
133 if (id
< pool
->base
+ pool
->n_ids
) {
134 pool
->next_free_id
= id
+ 1;
136 pool
->next_free_id
= pool
->base
;
144 id_pool_free_id(struct id_pool
*pool
, uint32_t id
)
146 struct id_node
*id_node
;
147 if (id
> pool
->base
&& (id
<= pool
->base
+ pool
->n_ids
)) {
148 id_node
= id_pool_find(pool
, id
);
150 hmap_remove(&pool
->map
, &id_node
->node
);
151 if (id
< pool
->next_free_id
) {
152 pool
->next_free_id
= id
;