]>
git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/ocf/src/utils/utils_refcnt.c
450092a79b4d473a734497baddbce353498064b7
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause-Clear
6 #include "../utils/utils_refcnt.h"
8 void ocf_refcnt_init(struct ocf_refcnt
*rc
)
10 env_atomic_set(&rc
->counter
, 0);
11 env_atomic_set(&rc
->freeze
, 0);
12 env_atomic_set(&rc
->callback
, 0);
16 void ocf_refcnt_dec(struct ocf_refcnt
*rc
)
18 int val
= env_atomic_dec_return(&rc
->counter
);
21 if (!val
&& env_atomic_cmpxchg(&rc
->callback
, 1, 0))
25 bool ocf_refcnt_inc(struct ocf_refcnt
*rc
)
27 if (!env_atomic_read(&rc
->freeze
)) {
28 env_atomic_inc(&rc
->counter
);
29 if (!env_atomic_read(&rc
->freeze
))
39 void ocf_refcnt_freeze(struct ocf_refcnt
*rc
)
41 env_atomic_inc(&rc
->freeze
);
44 void ocf_refcnt_register_zero_cb(struct ocf_refcnt
*rc
, ocf_refcnt_cb_t cb
,
47 ENV_BUG_ON(!env_atomic_read(&rc
->freeze
));
48 ENV_BUG_ON(env_atomic_read(&rc
->callback
));
50 env_atomic_inc(&rc
->counter
);
53 env_atomic_set(&rc
->callback
, 1);
57 void ocf_refcnt_unfreeze(struct ocf_refcnt
*rc
)
59 int val
= env_atomic_dec_return(&rc
->freeze
);