]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
add static macros for ISC_REFCOUNT_DECL/IMPL
authorEvan Hunt <each@isc.org>
Tue, 12 Mar 2024 08:02:48 +0000 (01:02 -0700)
committerEvan Hunt <each@isc.org>
Tue, 30 Apr 2024 19:31:48 +0000 (12:31 -0700)
this commit adds a mechanism to statically declare attach/detach
and ref/unref methods, for objects that are only accessed within
a single C file.

lib/isc/include/isc/refcount.h

index 8524b04410614d77e9a96e0bb063f963ce38d644..ad361288b480c6cbf5d6bfe7e37cb53eba637518 100644 (file)
@@ -119,19 +119,26 @@ typedef atomic_uint_fast32_t isc_refcount_t;
                ISC_INSIST(_refs > 0);                                \
        } while (0)
 
-#define ISC_REFCOUNT_TRACE_DECL(name)                                         \
-       name##_t *name##__ref(name##_t *ptr, const char *func,                \
-                             const char *file, unsigned int line);           \
-       void name##__unref(name##_t *ptr, const char *func, const char *file, \
-                          unsigned int line);                                \
-       void name##__attach(name##_t *ptr, name##_t **ptrp, const char *func, \
-                           const char *file, unsigned int line);             \
-       void name##__detach(name##_t **ptrp, const char *func,                \
-                           const char *file, unsigned int line)
-
-#define ISC_REFCOUNT_TRACE_IMPL(name, destroy)                                \
-       name##_t *name##__ref(name##_t *ptr, const char *func,                \
-                             const char *file, unsigned int line) {          \
+#define ISC__REFCOUNT_TRACE_DECL(name, stat)                               \
+       stat name##_t *name##__ref(name##_t *ptr, const char *func,        \
+                                  const char *file, unsigned int line);   \
+       stat void      name##__unref(name##_t *ptr, const char *func,      \
+                                    const char *file, unsigned int line); \
+       stat void      name##__attach(name##_t *ptr, name##_t **ptrp,      \
+                                     const char *func, const char *file,  \
+                                     unsigned int line);                  \
+       stat           name##__detach(name##_t **ptrp, const char *func,   \
+                                     const char *file, unsigned int line)
+
+#define ISC_REFCOUNT_BLANK
+#define ISC_REFCOUNT_TRACE_DECL(name) \
+       ISC__REFCOUNT_TRACE_DECL(name, ISC_REFCOUNT_BLANK)
+#define ISC_REFCOUNT_STATIC_TRACE_DECL(name) \
+       ISC__REFCOUNT_TRACE_DECL(name, static inline)
+
+#define ISC__REFCOUNT_TRACE_IMPL(name, destroy, stat)                         \
+       stat name##_t *name##__ref(name##_t *ptr, const char *func,           \
+                                  const char *file, unsigned int line) {     \
                REQUIRE(ptr != NULL);                                         \
                uint_fast32_t refs =                                          \
                        isc_refcount_increment(&ptr->references) + 1;         \
@@ -141,8 +148,8 @@ typedef atomic_uint_fast32_t isc_refcount_t;
                return (ptr);                                                 \
        }                                                                     \
                                                                               \
-       void name##__unref(name##_t *ptr, const char *func, const char *file, \
-                          unsigned int line) {                               \
+       stat void name##__unref(name##_t *ptr, const char *func,              \
+                               const char *file, unsigned int line) {        \
                REQUIRE(ptr != NULL);                                         \
                uint_fast32_t refs =                                          \
                        isc_refcount_decrement(&ptr->references) - 1;         \
@@ -154,8 +161,9 @@ typedef atomic_uint_fast32_t isc_refcount_t;
                        "%s:%s:%s:%u:t%u:%p->references = %" PRIuFAST32 "\n", \
                        __func__, func, file, line, isc_tid(), ptr, refs);    \
        }                                                                     \
-       void name##__attach(name##_t *ptr, name##_t **ptrp, const char *func, \
-                           const char *file, unsigned int line) {            \
+       stat void name##__attach(name##_t *ptr, name##_t **ptrp,              \
+                                const char *func, const char *file,          \
+                                unsigned int line) {                         \
                REQUIRE(ptrp != NULL && *ptrp == NULL);                       \
                uint_fast32_t refs =                                          \
                        isc_refcount_increment(&ptr->references) + 1;         \
@@ -165,8 +173,8 @@ typedef atomic_uint_fast32_t isc_refcount_t;
                *ptrp = ptr;                                                  \
        }                                                                     \
                                                                               \
-       void name##__detach(name##_t **ptrp, const char *func,                \
-                           const char *file, unsigned int line) {            \
+       stat void name##__detach(name##_t **ptrp, const char *func,           \
+                                const char *file, unsigned int line) {       \
                REQUIRE(ptrp != NULL && *ptrp != NULL);                       \
                name##_t *ptr = *ptrp;                                        \
                *ptrp = NULL;                                                 \
@@ -181,37 +189,51 @@ typedef atomic_uint_fast32_t isc_refcount_t;
                        __func__, func, file, line, isc_tid(), ptr, refs);    \
        }
 
-#define ISC_REFCOUNT_DECL(name)                                  \
-       name##_t *name##_ref(name##_t *ptr);                     \
-       void      name##_unref(name##_t *ptr);                   \
-       void      name##_attach(name##_t *ptr, name##_t **ptrp); \
-       void      name##_detach(name##_t **ptrp)
+#define ISC_REFCOUNT_TRACE_IMPL(name, destroy) \
+       ISC__REFCOUNT_TRACE_DECL(name, destroy, ISC_REFCOUNT_BLANK)
+#define ISC_REFCOUNT_STATIC_TRACE_IMPL(name, destroy) \
+       ISC__REFCOUNT_TRACE_DECL(name, destroy, static inline)
 
-#define ISC_REFCOUNT_IMPL(name, destroy)                             \
-       name##_t *name##_ref(name##_t *ptr) {                        \
+#define ISC__REFCOUNT_DECL(name, stat)                                      \
+       stat name##_t *name##_ref(name##_t *ptr) __attribute__((unused));   \
+       stat void      name##_unref(name##_t *ptr) __attribute__((unused)); \
+       stat void      name##_attach(name##_t *ptr, name##_t **ptrp)        \
+               __attribute__((unused));                                    \
+       stat void name##_detach(name##_t **ptrp) __attribute__((unused))
+
+#define ISC_REFCOUNT_DECL(name)               ISC__REFCOUNT_DECL(name, ISC_REFCOUNT_BLANK)
+#define ISC_REFCOUNT_STATIC_DECL(name) ISC__REFCOUNT_DECL(name, static inline)
+
+#define ISC__REFCOUNT_IMPL(name, destroy, stat)                      \
+       stat name##_t *name##_ref(name##_t *ptr) {                   \
                REQUIRE(ptr != NULL);                                \
                isc_refcount_increment(&ptr->references);            \
                return (ptr);                                        \
        }                                                            \
                                                                      \
-       void name##_unref(name##_t *ptr) {                           \
+       stat void name##_unref(name##_t *ptr) {                      \
                REQUIRE(ptr != NULL);                                \
                if (isc_refcount_decrement(&ptr->references) == 1) { \
                        isc_refcount_destroy(&ptr->references);      \
                        destroy(ptr);                                \
                }                                                    \
        }                                                            \
-       void name##_attach(name##_t *ptr, name##_t **ptrp) {         \
+       stat void name##_attach(name##_t *ptr, name##_t **ptrp) {    \
                REQUIRE(ptrp != NULL && *ptrp == NULL);              \
                name##_ref(ptr);                                     \
                *ptrp = ptr;                                         \
        }                                                            \
                                                                      \
-       void name##_detach(name##_t **ptrp) {                        \
+       stat void name##_detach(name##_t **ptrp) {                   \
                REQUIRE(ptrp != NULL && *ptrp != NULL);              \
                name##_t *ptr = *ptrp;                               \
                *ptrp = NULL;                                        \
                name##_unref(ptr);                                   \
        }
 
+#define ISC_REFCOUNT_IMPL(name, destroy) \
+       ISC__REFCOUNT_IMPL(name, destroy, ISC_REFCOUNT_BLANK)
+#define ISC_REFCOUNT_STATIC_IMPL(name, destroy) \
+       ISC__REFCOUNT_IMPL(name, destroy, static inline)
+
 ISC_LANG_ENDDECLS