/**
\ingroup CBDATAAPI
*
- * Safely points to a cbdata-protected class (cbc), such as an AsyncJob.
+ * Safely points to a cbdata-protected class (cbc), such as an AsyncJob.
* When a cbc we communicate with disappears without
* notice or a notice has not reached us yet, this class prevents
* dereferencing the pointer to the gone cbc object.
/// support assigning a child cbc pointer to a parent cbc pointer
template <typename Other>
CbcPointer &operator =(const CbcPointer<Other> &o) {
- clear();
- cbc = o.raw(); // so that set() is accurate
- if (o.valid())
- lock = cbdataReference(o->toCbdata());
+ if (this != &o) { // assignment to self
+ clear();
+ cbc = o.raw(); // so that set() is accurate
+ if (o.valid())
+ lock = cbdataReference(o->toCbdata());
+ }
return *this;
}
template <class Cbc>
inline
-std::ostream &operator <<(std::ostream &os, const CbcPointer<Cbc> &p) {
+std::ostream &operator <<(std::ostream &os, const CbcPointer<Cbc> &p)
+{
return p.print(os);
}
template<class Cbc>
CbcPointer<Cbc> &CbcPointer<Cbc>::operator =(const CbcPointer &d)
{
- clear();
- cbc = d.cbc;
- if (d.lock && cbdataReferenceValid(d.lock))
- lock = cbdataReference(d.lock);
+ if (this != &d) { // assignment to self
+ clear();
+ cbc = d.cbc;
+ if (d.lock && cbdataReferenceValid(d.lock))
+ lock = cbdataReference(d.lock);
+ }
return *this;
}
}
template <class Cbc>
-std::ostream &CbcPointer<Cbc>::print(std::ostream &os) const {
+std::ostream &CbcPointer<Cbc>::print(std::ostream &os) const
+{
return os << cbc << '/' << lock;
}
-
#endif /* SQUID_CBC_POINTER_H */