mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-10 19:45:01 -05:00
0b9cd9448c
This patch changes a variety of small things related to our pkghash implementation with an eye toward performance, especially on native 32-bit systems. * Use `unsigned int` rather than `size_t` for hash sizes. We already return ERANGE for any attempted creation of a hash greater than 1 million elements, so unsigned int is more than large enough for our purposes. Switching to this type allows 32 bit systems to do native math without helper functions from libgcc. * _alpm_pkghash_create() now internally adds extra padding for additional array elements, rather than that being the responsibility of the caller. * #define values are moved into static const values in pkghash.c; a new `stride` value is also extracted (but remains set at 1). * Division and modulus operators are removed from the normal find and add paths if possible. We store the upper limit of the number of elements in the hash so we no longer need to calculate this every element addition. When doing wraparound position calculations, we only apply the modulus operator if the value is greater than the number of buckets. Signed-off-by: Dan McGee <dan@archlinux.org>
61 lines
1.9 KiB
C
61 lines
1.9 KiB
C
/*
|
|
* pkghash.h
|
|
*
|
|
* Copyright (c) 2011 Pacman Development Team <pacman-dev@archlinux.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of 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.
|
|
*
|
|
* This program 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 a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef _ALPM_PKGHASH_H
|
|
#define _ALPM_PKGHASH_H
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "alpm.h"
|
|
#include "alpm_list.h"
|
|
|
|
|
|
/**
|
|
* @brief A hash table for holding alpm_pkg_t objects.
|
|
*
|
|
* A combination of a hash table and a list, allowing for fast look-up
|
|
* by package name but also iteration over the packages.
|
|
*/
|
|
struct __alpm_pkghash_t {
|
|
/** data held by the hash table */
|
|
alpm_list_t **hash_table;
|
|
/** head node of the hash table data in normal list format */
|
|
alpm_list_t *list;
|
|
/** number of buckets in hash table */
|
|
unsigned int buckets;
|
|
/** number of entries in hash table */
|
|
unsigned int entries;
|
|
/** max number of entries before a resize is needed */
|
|
unsigned int limit;
|
|
};
|
|
|
|
typedef struct __alpm_pkghash_t alpm_pkghash_t;
|
|
|
|
alpm_pkghash_t *_alpm_pkghash_create(unsigned int size);
|
|
|
|
alpm_pkghash_t *_alpm_pkghash_add(alpm_pkghash_t *hash, alpm_pkg_t *pkg);
|
|
alpm_pkghash_t *_alpm_pkghash_add_sorted(alpm_pkghash_t *hash, alpm_pkg_t *pkg);
|
|
alpm_pkghash_t *_alpm_pkghash_remove(alpm_pkghash_t *hash, alpm_pkg_t *pkg, alpm_pkg_t **data);
|
|
|
|
void _alpm_pkghash_free(alpm_pkghash_t *hash);
|
|
|
|
alpm_pkg_t *_alpm_pkghash_find(alpm_pkghash_t *hash, const char *name);
|
|
|
|
#endif /* _ALPM_PKGHASH_H */
|