]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/ocf/src/utils/utils_refcnt.c
450092a79b4d473a734497baddbce353498064b7
[ceph.git] / ceph / src / spdk / ocf / src / utils / utils_refcnt.c
1 /*
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause-Clear
4 */
5
6 #include "../utils/utils_refcnt.h"
7
8 void ocf_refcnt_init(struct ocf_refcnt *rc)
9 {
10 env_atomic_set(&rc->counter, 0);
11 env_atomic_set(&rc->freeze, 0);
12 env_atomic_set(&rc->callback, 0);
13 rc->cb = NULL;
14 }
15
16 void ocf_refcnt_dec(struct ocf_refcnt *rc)
17 {
18 int val = env_atomic_dec_return(&rc->counter);
19 ENV_BUG_ON(val < 0);
20
21 if (!val && env_atomic_cmpxchg(&rc->callback, 1, 0))
22 rc->cb(rc->priv);
23 }
24
25 bool ocf_refcnt_inc(struct ocf_refcnt *rc)
26 {
27 if (!env_atomic_read(&rc->freeze)) {
28 env_atomic_inc(&rc->counter);
29 if (!env_atomic_read(&rc->freeze))
30 return true;
31 else
32 ocf_refcnt_dec(rc);
33 }
34
35 return false;
36 }
37
38
39 void ocf_refcnt_freeze(struct ocf_refcnt *rc)
40 {
41 env_atomic_inc(&rc->freeze);
42 }
43
44 void ocf_refcnt_register_zero_cb(struct ocf_refcnt *rc, ocf_refcnt_cb_t cb,
45 void *priv)
46 {
47 ENV_BUG_ON(!env_atomic_read(&rc->freeze));
48 ENV_BUG_ON(env_atomic_read(&rc->callback));
49
50 env_atomic_inc(&rc->counter);
51 rc->cb = cb;
52 rc->priv = priv;
53 env_atomic_set(&rc->callback, 1);
54 ocf_refcnt_dec(rc);
55 }
56
57 void ocf_refcnt_unfreeze(struct ocf_refcnt *rc)
58 {
59 int val = env_atomic_dec_return(&rc->freeze);
60 ENV_BUG_ON(val < 0);
61 }