]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/base/CbcPointer.h
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 #ifndef SQUID_CBC_POINTER_H
10 #define SQUID_CBC_POINTER_H
12 #include "base/TextException.h"
19 * Safely points to a cbdata-protected class (cbc), such as an AsyncJob.
20 * When a cbc we communicate with disappears without
21 * notice or a notice has not reached us yet, this class prevents
22 * dereferencing the pointer to the gone cbc object.
28 CbcPointer(); // a nil pointer
29 CbcPointer(Cbc
*aCbc
);
30 CbcPointer(const CbcPointer
&p
);
31 CbcPointer(CbcPointer
&&);
34 Cbc
*raw() const; ///< a temporary raw Cbc pointer; may be invalid
35 Cbc
*get() const; ///< a temporary valid raw Cbc pointer or NULL
36 Cbc
&operator *() const; ///< a valid Cbc reference or exception
37 Cbc
*operator ->() const; ///< a valid Cbc pointer or exception
39 // no bool operator because set() != valid()
40 bool set() const { return cbc
!= NULL
; } ///< was set but may be invalid
41 Cbc
*valid() const { return get(); } ///< was set and is valid
42 bool operator !() const { return !valid(); } ///< invalid or was not set
43 bool operator ==(const CbcPointer
<Cbc
> &o
) const { return lock
== o
.lock
; }
45 CbcPointer
&operator =(const CbcPointer
&p
);
46 CbcPointer
&operator =(CbcPointer
&&);
48 /// support converting a child cbc pointer into a parent cbc pointer
49 template <typename Other
>
50 CbcPointer(const CbcPointer
<Other
> &o
): cbc(o
.raw()), lock(NULL
) {
52 lock
= cbdataReference(o
->toCbdata());
55 /// support assigning a child cbc pointer to a parent cbc pointer
56 template <typename Other
>
57 CbcPointer
&operator =(const CbcPointer
<Other
> &o
) {
58 if (this != &o
) { // assignment to self
60 cbc
= o
.raw(); // so that set() is accurate
62 lock
= cbdataReference(o
->toCbdata());
67 void clear(); ///< make pointer not set; does not invalidate cbdata
69 std::ostream
&print(std::ostream
&os
) const;
72 Cbc
*cbc
; // a possibly invalid pointer to a cbdata class
73 void *lock
; // a valid pointer to cbc's cbdata or nil
78 std::ostream
&operator <<(std::ostream
&os
, const CbcPointer
<Cbc
> &p
)
86 CbcPointer
<Cbc
>::CbcPointer(): cbc(NULL
), lock(NULL
)
91 CbcPointer
<Cbc
>::CbcPointer(Cbc
*aCbc
): cbc(aCbc
), lock(NULL
)
94 lock
= cbdataReference(cbc
->toCbdata());
98 CbcPointer
<Cbc
>::CbcPointer(const CbcPointer
&d
): cbc(d
.cbc
), lock(NULL
)
100 if (d
.lock
&& cbdataReferenceValid(d
.lock
))
101 lock
= cbdataReference(d
.lock
);
105 CbcPointer
<Cbc
>::CbcPointer(CbcPointer
&&d
): cbc(d
.cbc
), lock(d
.lock
)
112 CbcPointer
<Cbc
>::~CbcPointer()
118 CbcPointer
<Cbc
> &CbcPointer
<Cbc
>::operator =(const CbcPointer
&d
)
120 if (this != &d
) { // assignment to self
123 if (d
.lock
&& cbdataReferenceValid(d
.lock
))
124 lock
= cbdataReference(d
.lock
);
130 CbcPointer
<Cbc
> &CbcPointer
<Cbc
>::operator =(CbcPointer
&&d
)
132 if (this != &d
) { // assignment to self
144 CbcPointer
<Cbc
>::clear()
147 debugs(45, 3, "cbc=" << (void*)cbc
<< ", lock=" << (void*)lock
);
149 cbdataReferenceDone(lock
); // lock may be nil before and will be nil after
155 CbcPointer
<Cbc
>::raw() const
162 CbcPointer
<Cbc
>::get() const
164 return (lock
&& cbdataReferenceValid(lock
)) ? cbc
: NULL
;
169 CbcPointer
<Cbc
>::operator *() const
178 CbcPointer
<Cbc
>::operator ->() const
186 std::ostream
&CbcPointer
<Cbc
>::print(std::ostream
&os
) const
188 return os
<< cbc
<< '/' << lock
;
191 #endif /* SQUID_CBC_POINTER_H */