Squid Web Cache master
Loading...
Searching...
No Matches
cbdata.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9#ifndef SQUID_SRC_CBDATA_H
10#define SQUID_SRC_CBDATA_H
11
195typedef int cbdata_type;
197
204
218void *cbdataInternalFree(void *p);
219
220void cbdataInternalLock(const void *p);
221void cbdataInternalUnlock(const void *p);
222
238int cbdataInternalReferenceDoneValid(void **p, void **tp);
239#define cbdataReferenceValidDone(var, ptr) cbdataInternalReferenceDoneValid((void **)&(var), (ptr))
240
247int cbdataReferenceValid(const void *p);
248
254cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size);
255
257#define CBDATA_DECL_(type, methodSpecifiers) \
258 void *operator new(size_t size) { \
259 assert(size == sizeof(type)); \
260 if (!CBDATA_##type) CBDATA_##type = cbdataInternalAddType(CBDATA_##type, #type, sizeof(type)); \
261 return (type *)cbdataInternalAlloc(CBDATA_##type); \
262 } \
263 public: \
264 void operator delete (void *address) { \
265 if (address) cbdataInternalFree(address); \
266 } \
267 void *toCbdata() methodSpecifiers { return this; } \
268 private: \
269 static cbdata_type CBDATA_##type;
270
276{
277public:
278 virtual ~CbdataParent() {}
279 virtual void *toCbdata() = 0;
280
281private:
283 virtual void finalizedInCbdataChild() = 0;
284};
285
289#define CBDATA_CLASS(type) public: CBDATA_DECL_(type, noexcept)
290
294#define CBDATA_CLASS_WITH_MAKE(type) private: CBDATA_DECL_(type, noexcept)
295
299#define CBDATA_CHILD(type) public: CBDATA_DECL_(type, final) \
300 void finalizedInCbdataChild() final {}
301
311#define CBDATA_INTERMEDIATE() \
312 public: \
313 void *toCbdata() override { return this; } \
314 private:
315
325#define CBDATA_CLASS_INIT(type) cbdata_type type::CBDATA_##type = CBDATA_UNKNOWN
326
333#define CBDATA_NAMESPACED_CLASS_INIT(namespace, type) cbdata_type namespace::type::CBDATA_##type = CBDATA_UNKNOWN
334
348#define cbdataReference(var) (cbdataInternalLock(var), var)
349
357#define cbdataReferenceDone(var) do {if (var) {cbdataInternalUnlock(var); var = nullptr;}} while(0)
358
366{
368
369public:
370 generic_cbdata(void *aData) : data(aData) {}
371
372 template<typename wrapped_type>void unwrap(wrapped_type **output) {
373 *output = static_cast<wrapped_type *>(data);
374 delete this;
375 }
376
377private:
378 void *data;
379};
380
381// Discouraged: Use CbcPointer<> and asynchronous calls instead if possible.
384{
385public:
386 CallbackData(): data_(nullptr) {}
387 CallbackData(void *data): data_(cbdataReference(data)) {}
389 CallbackData(CallbackData &&other): data_(other.data_) { other.data_ = nullptr; }
391
392 CallbackData &operator =(const CallbackData &other);
393 CallbackData &operator =(CallbackData &&other) { cbdataReferenceDone(data_); data_ = other.data_; other.data_ = nullptr; return *this; }
394
395 bool valid() const { return cbdataReferenceValid(data_); }
396 void *validDone() { void *result; return cbdataReferenceValidDone(data_, &result) ? result : nullptr; }
397
398private:
399 void *data_;
400};
401
402#endif /* SQUID_SRC_CBDATA_H */
403
int size
Definition ModDevPoll.cc:70
void * cbdataInternalFree(void *p)
Definition cbdata.cc:208
void cbdataInternalUnlock(const void *p)
Definition cbdata.cc:243
#define cbdataReferenceDone(var)
Definition cbdata.h:357
#define cbdataReference(var)
Definition cbdata.h:348
static const cbdata_type CBDATA_UNKNOWN
Definition cbdata.h:196
int cbdataInternalReferenceDoneValid(void **p, void **tp)
Definition cbdata.cc:287
#define cbdataReferenceValidDone(var, ptr)
Definition cbdata.h:239
cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size)
Definition cbdata.cc:122
int cbdataReferenceValid(const void *p)
Definition cbdata.cc:270
void * cbdataInternalAlloc(cbdata_type type)
Definition cbdata.cc:150
#define CBDATA_CLASS(type)
Definition cbdata.h:289
void cbdataInternalLock(const void *p)
Definition cbdata.cc:226
int cbdata_type
Definition cbdata.h:195
an old-style void* callback parameter
Definition cbdata.h:384
~CallbackData()
Definition cbdata.h:390
void * validDone()
Definition cbdata.h:396
bool valid() const
Definition cbdata.h:395
CallbackData(CallbackData &&other)
Definition cbdata.h:389
CallbackData(void *data)
Definition cbdata.h:387
CallbackData & operator=(const CallbackData &other)
Definition cbdata.cc:305
void * data_
raw callback data, maybe invalid
Definition cbdata.h:399
CallbackData(const CallbackData &other)
Definition cbdata.h:388
virtual void finalizedInCbdataChild()=0
hack: ensure CBDATA_CHILD() after a toCbdata()-defining CBDATA_INTERMEDIATE()
virtual void * toCbdata()=0
virtual ~CbdataParent()
Definition cbdata.h:278
void * data
Definition cbdata.h:378
void unwrap(wrapped_type **output)
Definition cbdata.h:372
generic_cbdata(void *aData)
Definition cbdata.h:370