類成員:
struct RefCountedObject {
private:
atomic_t nref;
CephContext *cct;
原子變量nref用于對cct對象進行計數,每當調用get函數,計數加一:
RefCountedObject *get() {
int v = nref.inc();
if (cct)
lsubdout(cct, refs, 1) << "RefCountedObject::get " << this << " "<< (v - 1) << " -> " << v<< dendl;
return this;
}
調用put函數,計數減一:
void put() {
CephContext *local_cct = cct;
int v = nref.dec();
if (v == 0) {
ANNOTATE_HAPPENS_AFTER(&nref);
ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(&nref);
delete this;
} else {
ANNOTATE_HAPPENS_BEFORE(&nref);
}
if (local_cct)
lsubdout(local_cct, refs, 1) << "RefCountedObject::put " << this << " "<< (v + 1) << " -> " << v<< dendl;
}