From 0dcca1055908f7537870d866baa4c8bab0402ea9 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Wed, 3 Jan 2024 19:13:44 +0100 Subject: [PATCH] bits.h -> bitops.h, start bitops refactor: target all implem. visible --- include/bitops.h | 24 ++++++++++++++++++++++-- include/br.h | 2 +- include/bug.h | 9 +++------ include/hash.h | 3 ++- include/list_sort.h | 2 -- include/pjwhash-inline.h | 4 ++-- include/pjwhash.h | 4 ++-- include/pool.h | 5 +++-- include/struct-group.h | 26 +++++++++++++------------- src/bitops.c | 6 +++--- src/list_sort.c | 2 +- src/pjwhash.c | 5 +---- src/pool.c | 4 ++-- 13 files changed, 55 insertions(+), 41 deletions(-) diff --git a/include/bitops.h b/include/bitops.h index 4c0e59a..0f8cf53 100644 --- a/include/bitops.h +++ b/include/bitops.h @@ -1,6 +1,6 @@ -/* bits.h - bits functions. +/* bitops.h - bits functions. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -44,6 +44,26 @@ void print_bitops_impl(void); /* count set bits: 10101000 -> 3 * ^ ^ ^ */ +#if __has_builtin(__builtin_popcountll) +#define ___popcount64_native(n) __builtin_popcountll(n) +#endif +#if __has_builtin(__builtin_popcount) +#define ___popcount32_native(n) __builtin_popcount(n) +#endif +#define ___popcount_emulated(n) ({ \ + int ___count = 0; \ + while (n) { \ + ___count++; \ + n &= (n - 1); \ + } \ + ___count; }) + +#ifdef ___popcount64_native +#define ppcount64(n) ___popcount64_native(n) +#else +#define ppcount64(n) ___popcount_emulated(n) +#endif + static __always_inline int popcount64(u64 n) { # if __has_builtin(__builtin_popcountll) diff --git a/include/br.h b/include/br.h index 3902d85..f1ad5eb 100644 --- a/include/br.h +++ b/include/br.h @@ -1,6 +1,6 @@ /* br.h - misc macros. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * diff --git a/include/bug.h b/include/bug.h index fdff9b8..d1476b8 100644 --- a/include/bug.h +++ b/include/bug.h @@ -20,9 +20,6 @@ * can somehow continue operating, perhaps with reduced functionality, * it's probably not BUG-worthy. * - * If you're tempted to BUG(), think again: is completely giving up - * really the *only* solution? There are usually better options, where - * users don't need to reboot ASAP and can mostly shut down cleanly. */ #define BUG() do { \ fprintf(stderr, "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ @@ -32,9 +29,8 @@ #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0) /* - * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report - * significant kernel issues that need prompt attention if they should ever - * appear at runtime. + * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report significant + * issues that need prompt attention if they should ever appear at runtime. * * Do not use these macros when checking for invalid external inputs * (e.g. invalid system call arguments, or invalid data coming from @@ -50,6 +46,7 @@ #define __WARN() do { \ fprintf(stderr, "WARNING: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ } while (0) + #define __WARN_printf(arg...) do { \ vfprintf(stderr, arg); \ } while (0) diff --git a/include/hash.h b/include/hash.h index 3c9b99d..409178d 100644 --- a/include/hash.h +++ b/include/hash.h @@ -9,8 +9,9 @@ (C) 2002 Nadia Yvette Chambers, IBM */ #include -#include "bits.h" + #include "br.h" +#include "bitops.h" /* * The "GOLDEN_RATIO_PRIME" is used in ifs/btrfs/brtfs_inode.h and diff --git a/include/list_sort.h b/include/list_sort.h index 6d67cbe..73c5d4e 100644 --- a/include/list_sort.h +++ b/include/list_sort.h @@ -7,8 +7,6 @@ #ifndef _BR_LIST_SORT_H #define _BR_LIST_SORT_H -//#include - struct list_head; typedef int __attribute__((nonnull(2,3))) (*list_cmp_func_t)(void *, diff --git a/include/pjwhash-inline.h b/include/pjwhash-inline.h index ed5e8f5..625b86d 100644 --- a/include/pjwhash-inline.h +++ b/include/pjwhash-inline.h @@ -1,6 +1,6 @@ /* pjwhash-inline.h - PJW hash function, inline version. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -14,7 +14,7 @@ #ifndef _PJWHASH_INLINE_H #define _PJWHASH_INLINE_H -#include "bits.h" +#include "br.h" #define THREE_QUARTERS ((int) ((BITS_PER_INT * 3) / 4)) #define ONE_EIGHTH ((int) (BITS_PER_INT / 8)) diff --git a/include/pjwhash.h b/include/pjwhash.h index 19b0d76..2e8835d 100644 --- a/include/pjwhash.h +++ b/include/pjwhash.h @@ -1,6 +1,6 @@ /* pjwhash.h - PJW hash function, extern version. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -13,7 +13,7 @@ #ifndef _PJWHASH_H #define _PJWHASH_H -#include "bits.h" +#include "br.h" /** * unsigned int pjwhash - PJW hash function diff --git a/include/pool.h b/include/pool.h index a207012..d2e1412 100644 --- a/include/pool.h +++ b/include/pool.h @@ -1,6 +1,6 @@ /* pool.h - A simple memory pool manager. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -16,8 +16,9 @@ #include #include + +#include "br.h" #include "list.h" -#include "bits.h" #define POOL_NAME_LENGTH (16) /* max name length including trailing \0 */ diff --git a/include/struct-group.h b/include/struct-group.h index 4afeeb3..03055f4 100644 --- a/include/struct-group.h +++ b/include/struct-group.h @@ -1,6 +1,6 @@ /* struct-group.h - mirrored structure macros. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -33,10 +33,10 @@ * as both having struct attributes appended. */ #define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \ - union { \ - struct { MEMBERS } ATTRS; \ - struct TAG { MEMBERS } ATTRS NAME; \ - } + union { \ + struct { MEMBERS } ATTRS; \ + struct TAG { MEMBERS } ATTRS NAME; \ + } /** * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union @@ -48,11 +48,11 @@ * struct, it needs to be wrapped in an anonymous struct with at least 1 * named member, but that member can be empty. */ -#define DECLARE_FLEX_ARRAY(TYPE, NAME) \ - struct { \ - struct { } __empty_ ## NAME; \ - TYPE NAME[]; \ - } +#define DECLARE_FLEX_ARRAY(TYPE, NAME) \ + struct { \ + struct { } __empty_ ## NAME; \ + TYPE NAME[]; \ + } /** * struct_group() - Wrap a set of declarations in a mirrored struct @@ -67,7 +67,7 @@ * struct members. */ #define struct_group(NAME, MEMBERS...) \ - __struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS) + __struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS) /** * struct_group_attr() - Create a struct_group() with trailing attributes @@ -83,7 +83,7 @@ * struct members. Includes structure attributes argument. */ #define struct_group_attr(NAME, ATTRS, MEMBERS...) \ - __struct_group(/* no tag */, NAME, ATTRS, MEMBERS) + __struct_group(/* no tag */, NAME, ATTRS, MEMBERS) /** * struct_group_tagged() - Create a struct_group with a reusable tag @@ -100,6 +100,6 @@ * so the specified layout can be reused later. */ #define struct_group_tagged(TAG, NAME, MEMBERS...) \ - __struct_group(TAG, NAME, /* no attrs */, MEMBERS) + __struct_group(TAG, NAME, /* no attrs */, MEMBERS) #endif /* _STRUCT_GROUP_H */ diff --git a/src/bitops.c b/src/bitops.c index 4096bf8..5f86b6a 100644 --- a/src/bitops.c +++ b/src/bitops.c @@ -1,6 +1,6 @@ -/* bits.c - information about bitops implementation. +/* bitops.c - information about bitops implementation. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -11,7 +11,7 @@ * */ -#include "bits.h" +#include "bitops.h" #include "debug.h" void print_bitops_impl(void) diff --git a/src/list_sort.c b/src/list_sort.c index 79180ea..962dcc7 100644 --- a/src/list_sort.c +++ b/src/list_sort.c @@ -3,9 +3,9 @@ /* * Taken from linux kernel: lib/list_sort.c */ +#include "br.h" #include "list_sort.h" #include "list.h" -#include "bits.h" #include "likely.h" /* diff --git a/src/pjwhash.c b/src/pjwhash.c index 554f9e3..4d93152 100644 --- a/src/pjwhash.c +++ b/src/pjwhash.c @@ -1,6 +1,6 @@ /* pjwhash.c - PJW hash function. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -13,8 +13,5 @@ #define _pjw_inline extern -//#include "bits.h" -//extern unsigned int pjwhash (const void* key, uint length); - #include "pjwhash.h" #include "pjwhash-inline.h" diff --git a/src/pool.c b/src/pool.c index a423141..e507b25 100644 --- a/src/pool.c +++ b/src/pool.c @@ -1,6 +1,6 @@ /* pool.c - A simple pool manager. * - * Copyright (C) 2021-2022 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -17,10 +17,10 @@ #include #include +#include "br.h" #include "list.h" #include "pool.h" #include "debug.h" -#include "bits.h" void pool_stats(pool_t *pool) {