From patchwork Tue Oct 10 13:42:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 77409 X-Patchwork-Delegate: amerey@redhat.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0B37F3861822 for ; Tue, 10 Oct 2023 13:44:00 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 8E46B3858426 for ; Tue, 10 Oct 2023 13:43:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8E46B3858426 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from r6.localdomain (82-217-174-174.cable.dynamic.v4.ziggo.nl [82.217.174.174]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id D948F301FEB6; Tue, 10 Oct 2023 15:43:34 +0200 (CEST) Received: by r6.localdomain (Postfix, from userid 1000) id 25EF43403D4; Tue, 10 Oct 2023 15:43:34 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: hsm2@rice.edu, Mark Wielaard Subject: [PATCH 07/16] lib: Add eu_tsearch and eu_tfind Date: Tue, 10 Oct 2023 15:42:51 +0200 Message-ID: <20231010134300.53830-7-mark@klomp.org> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231010134300.53830-1-mark@klomp.org> References: <301fac87e83ebbbd677750579ae9a3429b461bdf.camel@klomp.org> <20231010134300.53830-1-mark@klomp.org> MIME-Version: 1.0 X-Spam-Status: No, score=-3033.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org From: Heather McIntyre * lib/eu-search.h: New file. Declarations for read/write locked eu_tsearch/eu_tfind. * lib/eu-search.c: New file. Definitions for read/write locked eu_tsearch/eu_tfind. * Makefile.am (libeu_a_SOURCES): Add eu-search.c. Signed-off-by: Heather S. McIntyre Signed-off-by: Mark Wielaard --- lib/Makefile.am | 2 +- lib/eu-search.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/eu-search.h | 39 ++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 lib/eu-search.c create mode 100644 lib/eu-search.h diff --git a/lib/Makefile.am b/lib/Makefile.am index b3bb929f..ce8f3e1b 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -34,7 +34,7 @@ AM_CPPFLAGS += -I$(srcdir)/../libelf noinst_LIBRARIES = libeu.a libeu_a_SOURCES = xasprintf.c xstrdup.c xstrndup.c xmalloc.c next_prime.c \ - crc32.c crc32_file.c \ + crc32.c crc32_file.c eu-search.c \ color.c error.c printversion.c noinst_HEADERS = fixedsizehash.h libeu.h system.h dynamicsizehash.h list.h \ diff --git a/lib/eu-search.c b/lib/eu-search.c new file mode 100644 index 00000000..a6b04f4f --- /dev/null +++ b/lib/eu-search.c @@ -0,0 +1,60 @@ +/* Definitions for thread-safe tsearch/tfind + Copyright (C) 2023 Rice University + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include "eu-search.h" + +rwlock_define(static, search_find_lock); + +void *eu_tsearch(const void *key, void **rootp, + int (*compar)(const void *, const void *)) +{ + void *ret = NULL; + rwlock_wrlock(search_find_lock); + + ret = tsearch(key, rootp, compar); + + rwlock_unlock(search_find_lock); + return ret; +} + +void *eu_tfind(const void *key, void *const *rootp, + int (*compar)(const void *, const void *)) +{ + void *ret = NULL; + rwlock_rdlock(search_find_lock); + + ret = tfind(key, rootp, compar); + + rwlock_unlock(search_find_lock); + return ret; +} diff --git a/lib/eu-search.h b/lib/eu-search.h new file mode 100644 index 00000000..4ce0139a --- /dev/null +++ b/lib/eu-search.h @@ -0,0 +1,39 @@ +/* Calls for thread-safe tsearch/tfind + Copyright (C) 2023 Rice University + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef EU_SEARCH_H +#define EU_SEARCH_H 1 + +#include + +extern void *eu_tsearch(const void *key, void **rootp, + int (*compar)(const void *, const void *)); +extern void *eu_tfind(const void *key, void *const *rootp, + int (*compar)(const void *, const void *)); + +#endif