]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Replace cbdata::Offset hack with offsetof() (#809)
authorAmos Jeffries <yadij@users.noreply.github.com>
Tue, 4 May 2021 01:39:44 +0000 (01:39 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Tue, 4 May 2021 01:39:47 +0000 (01:39 +0000)
Also remove unused OFFSET_OF macro.

src/cbdata.cc

index 49156cd4ec0092e7b9610bbc42a26d646d8bfcaa..732782888b36e4efecd51b7d43d8a2ff97c077a9 100644 (file)
@@ -16,6 +16,7 @@
 #include "Store.h"
 
 #include <climits>
+#include <cstddef>
 
 #if USE_CBDATA_DEBUG
 #include <algorithm>
@@ -46,8 +47,6 @@ public:
 
 #endif
 
-#define OFFSET_OF(TYPE, MEMBER) ((size_t) &(((TYPE) *)0)->(MEMBER))
-
 /**
  * Manage a set of registered callback data pointers.
  * One of the easiest ways to make Squid coredump is to issue a
@@ -91,6 +90,15 @@ public:
     {}
     ~cbdata();
 
+    static cbdata *FromUserData(const void *p) {
+#if WITH_VALGRIND
+        return cbdata_htable.at(p);
+#else
+        const auto t = static_cast<const char *>(p) - offsetof(cbdata, data);
+        return reinterpret_cast<cbdata *>(const_cast<char *>(t));
+#endif
+    }
+
     int valid;
     int32_t locks;
     cbdata_type type;
@@ -116,25 +124,14 @@ public:
 
 #if !WITH_VALGRIND
     size_t dataSize() const { return sizeof(data);}
-    static long MakeOffset();
-    static const long Offset;
 #endif
     /* MUST be the last per-instance member */
     void *data;
 };
 
-const long cbdata::Cookie((long)0xDEADBEEF);
-#if !WITH_VALGRIND
-const long cbdata::Offset(MakeOffset());
+static_assert(std::is_standard_layout<cbdata>::value, "the behavior of offsetof(cbdata) is defined");
 
-long
-cbdata::MakeOffset()
-{
-    cbdata *zero = (cbdata *)0L;
-    void **dataOffset = &zero->data;
-    return (long)dataOffset;
-}
-#endif
+const long cbdata::Cookie((long)0xDEADBEEF);
 
 static OBJH cbdataDump;
 #if USE_CBDATA_DEBUG
@@ -186,8 +183,7 @@ cbdataInternalInitType(cbdata_type type, const char *name, int size)
     snprintf(label, strlen(name) + 20, "cbdata %s (%d)", name, (int) type);
 
 #if !WITH_VALGRIND
-    assert((size_t)cbdata::Offset == (sizeof(cbdata) - ((cbdata *)NULL)->dataSize()));
-    size += cbdata::Offset;
+    size += offsetof(cbdata, data);
 #endif
 
     cbdata_index[type].pool = memPoolCreate(label, size);
@@ -297,12 +293,7 @@ cbdataRealFree(cbdata *c, const char *file, const int line)
 void *
 cbdataInternalFree(void *p, const char *file, int line)
 {
-    cbdata *c;
-#if WITH_VALGRIND
-    c = cbdata_htable.at(p);
-#else
-    c = (cbdata *) (((char *) p) - cbdata::Offset);
-#endif
+    auto *c = cbdata::FromUserData(p);
 #if USE_CBDATA_DEBUG
     debugs(45, 3, p << " " << file << ":" << line);
 #else
@@ -333,16 +324,10 @@ cbdataInternalLockDbg(const void *p, const char *file, int line)
 cbdataInternalLock(const void *p)
 #endif
 {
-    cbdata *c;
-
     if (p == NULL)
         return;
 
-#if WITH_VALGRIND
-    c = cbdata_htable.at(p);
-#else
-    c = (cbdata *) (((char *) p) - cbdata::Offset);
-#endif
+    auto *c = cbdata::FromUserData(p);
 
 #if USE_CBDATA_DEBUG
     debugs(45, 3, p << "=" << (c ? c->locks + 1 : -1) << " " << file << ":" << line);
@@ -365,16 +350,10 @@ cbdataInternalUnlockDbg(const void *p, const char *file, int line)
 cbdataInternalUnlock(const void *p)
 #endif
 {
-    cbdata *c;
-
     if (p == NULL)
         return;
 
-#if WITH_VALGRIND
-    c = cbdata_htable.at(p);
-#else
-    c = (cbdata *) (((char *) p) - cbdata::Offset);
-#endif
+    auto *c = cbdata::FromUserData(p);
 
 #if USE_CBDATA_DEBUG
     debugs(45, 3, p << "=" << (c ? c->locks - 1 : -1) << " " << file << ":" << line);
@@ -411,18 +390,12 @@ cbdataInternalUnlock(const void *p)
 int
 cbdataReferenceValid(const void *p)
 {
-    cbdata *c;
-
     if (p == NULL)
         return 1;       /* A NULL pointer cannot become invalid */
 
     debugs(45, 9, p);
 
-#if WITH_VALGRIND
-    c = cbdata_htable.at(p);
-#else
-    c = (cbdata *) (((char *) p) - cbdata::Offset);
-#endif
+    const auto c = cbdata::FromUserData(p);
 
     c->check(__LINE__);
 
@@ -502,7 +475,7 @@ cbdataDump(StoreEntry * sentry)
 #if WITH_VALGRIND
             int obj_size = pool->objectSize();
 #else
-            int obj_size = pool->objectSize() - cbdata::Offset;
+            int obj_size = pool->objectSize() - offsetof(cbdata, data);
 #endif
             storeAppendPrintf(sentry, "%s\t%d\t%ld\t%ld\n", pool->objectType() + 7, obj_size, (long int)pool->getMeter().inuse.currentLevel(), (long int)obj_size * pool->getMeter().inuse.currentLevel());
         }