rc->cb = NULL;
}
-void ocf_refcnt_dec(struct ocf_refcnt *rc)
+int ocf_refcnt_dec(struct ocf_refcnt *rc)
{
int val = env_atomic_dec_return(&rc->counter);
ENV_BUG_ON(val < 0);
if (!val && env_atomic_cmpxchg(&rc->callback, 1, 0))
rc->cb(rc->priv);
+
+ return val;
}
-bool ocf_refcnt_inc(struct ocf_refcnt *rc)
+int ocf_refcnt_inc(struct ocf_refcnt *rc)
{
+ int val;
+
if (!env_atomic_read(&rc->freeze)) {
- env_atomic_inc(&rc->counter);
+ val = env_atomic_inc_return(&rc->counter);
if (!env_atomic_read(&rc->freeze))
- return true;
+ return val;
else
ocf_refcnt_dec(rc);
}
- return false;
+ return 0;
}
int val = env_atomic_dec_return(&rc->freeze);
ENV_BUG_ON(val < 0);
}
+
+bool ocf_refcnt_frozen(struct ocf_refcnt *rc)
+{
+ return !!env_atomic_read(&rc->freeze);
+}