cbdata.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 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 
195 typedef int cbdata_type;
196 static const cbdata_type CBDATA_UNKNOWN = 0;
197 
203 void *cbdataInternalAlloc(cbdata_type type);
204 
218 void *cbdataInternalFree(void *p);
219 
220 void cbdataInternalLock(const void *p);
221 void cbdataInternalUnlock(const void *p);
222 
238 int cbdataInternalReferenceDoneValid(void **p, void **tp);
239 #define cbdataReferenceValidDone(var, ptr) cbdataInternalReferenceDoneValid((void **)&(var), (ptr))
240 
247 int cbdataReferenceValid(const void *p);
248 
254 cbdata_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 {
277 public:
278  virtual ~CbdataParent() {}
279  virtual void *toCbdata() = 0;
280 
281 private:
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 
369 public:
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 
377 private:
378  void *data;
379 };
380 
381 // Discouraged: Use CbcPointer<> and asynchronous calls instead if possible.
384 {
385 public:
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 
398 private:
399  void *data_;
400 };
401 
402 #endif /* SQUID_SRC_CBDATA_H */
403 
an old-style void* callback parameter
Definition: cbdata.h:383
CallbackData(const CallbackData &other)
Definition: cbdata.h:388
CallbackData & operator=(const CallbackData &other)
Definition: cbdata.cc:305
#define cbdataReferenceValidDone(var, ptr)
Definition: cbdata.h:239
virtual ~CbdataParent()
Definition: cbdata.h:278
#define CBDATA_CLASS(type)
Definition: cbdata.h:289
bool valid() const
Definition: cbdata.h:395
#define cbdataReference(var)
Definition: cbdata.h:348
void cbdataInternalUnlock(const void *p)
Definition: cbdata.cc:243
virtual void * toCbdata()=0
int cbdataInternalReferenceDoneValid(void **p, void **tp)
Definition: cbdata.cc:287
int size
Definition: ModDevPoll.cc:69
static const cbdata_type CBDATA_UNKNOWN
Definition: cbdata.h:196
CallbackData(CallbackData &&other)
Definition: cbdata.h:389
virtual void finalizedInCbdataChild()=0
hack: ensure CBDATA_CHILD() after a toCbdata()-defining CBDATA_INTERMEDIATE()
generic_cbdata(void *aData)
Definition: cbdata.h:370
int cbdata_type
Definition: cbdata.h:195
void * data
Definition: cbdata.h:378
void * cbdataInternalFree(void *p)
Definition: cbdata.cc:208
CallbackData(void *data)
Definition: cbdata.h:387
#define cbdataReferenceDone(var)
Definition: cbdata.h:357
~CallbackData()
Definition: cbdata.h:390
int cbdataReferenceValid(const void *p)
Definition: cbdata.cc:270
cbdata_type cbdataInternalAddType(cbdata_type type, const char *label, int size)
Definition: cbdata.cc:122
CallbackData()
Definition: cbdata.h:386
void cbdataInternalLock(const void *p)
Definition: cbdata.cc:226
void unwrap(wrapped_type **output)
Definition: cbdata.h:372
void * validDone()
Definition: cbdata.h:396
void * cbdataInternalAlloc(cbdata_type type)
Definition: cbdata.cc:150
void * data_
raw callback data, maybe invalid
Definition: cbdata.h:399

 

Introduction

Documentation

Support

Miscellaneous