[pacman-dev] [PATCH 1/2] libalpm: const annotate struct pkg_operations

Allan McRae allan at archlinux.org
Wed Dec 23 23:58:42 UTC 2020


On 24/12/20 8:41 am, Emil Velikov wrote:
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---

This patch does a lot more than just add const annotations.  And it
looks to me like the extra bit needs justification, so separate patch
please.

>  lib/libalpm/be_local.c   |  2 +-
>  lib/libalpm/be_package.c |  2 +-
>  lib/libalpm/be_sync.c    | 20 ++++++++++++++++++--
>  lib/libalpm/package.c    |  2 +-
>  lib/libalpm/package.h    |  4 ++--
>  5 files changed, 23 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
> index e73a97bb..9c3c8bb3 100644
> --- a/lib/libalpm/be_local.c
> +++ b/lib/libalpm/be_local.c
> @@ -326,7 +326,7 @@ static int _cache_force_load(alpm_pkg_t *pkg)
>   * lazy accessor methods that handle any backend loading and caching
>   * logic.
>   */
> -static struct pkg_operations local_pkg_ops = {
> +static const struct pkg_operations local_pkg_ops = {
>  	.get_base = _cache_get_base,
>  	.get_desc = _cache_get_desc,
>  	.get_url = _cache_get_url,
> diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
> index 4dde7167..f855003a 100644
> --- a/lib/libalpm/be_package.c
> +++ b/lib/libalpm/be_package.c
> @@ -138,7 +138,7 @@ static int _package_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp)
>   * majority of the default_pkg_ops struct and add only a few operations of
>   * our own on top.
>   */
> -static struct pkg_operations *get_file_pkg_ops(void)
> +static const struct pkg_operations *get_file_pkg_ops(void)
>  {
>  	static struct pkg_operations file_pkg_ops;
>  	static int file_pkg_ops_initialized = 0;
> diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
> index 225df76d..5356b544 100644
> --- a/lib/libalpm/be_sync.c
> +++ b/lib/libalpm/be_sync.c
> @@ -281,6 +281,23 @@ static int _sync_get_validation(alpm_pkg_t *pkg)
>  	return pkg->validation;
>  }
>  
> +/** Package sync operations struct accessor. We implement this as a method
> + * rather than a static struct as in be_files because we want to reuse the
> + * majority of the default_pkg_ops struct and add only a few operations of
> + * our own on top.
> + */
> +static const struct pkg_operations *get_sync_pkg_ops(void)
> +{
> +	static struct pkg_operations sync_pkg_ops;
> +	static int sync_pkg_ops_initalized = 0;
> +	if(!sync_pkg_ops_initalized) {
> +		sync_pkg_ops = default_pkg_ops;
> +		sync_pkg_ops.get_validation = _sync_get_validation;
> +		sync_pkg_ops_initalized = 1;
> +	}
> +	return &sync_pkg_ops;
> +}
> +
>  static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
>  		const char **entry_filename, alpm_pkg_t *likely_pkg)
>  {
> @@ -321,8 +338,7 @@ static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
>  
>  		pkg->origin = ALPM_PKG_FROM_SYNCDB;
>  		pkg->origin_data.db = db;
> -		pkg->ops = &default_pkg_ops;
> -		pkg->ops->get_validation = _sync_get_validation;
> +		pkg->ops = get_sync_pkg_ops();
>  		pkg->handle = db->handle;
>  
>  		/* add to the collection */
> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
> index a4356518..5766c600 100644
> --- a/lib/libalpm/package.c
> +++ b/lib/libalpm/package.c
> @@ -138,7 +138,7 @@ static int _pkg_force_load(alpm_pkg_t UNUSED *pkg) { return 0; }
>  /** The standard package operations struct. Get fields directly from the
>   * struct itself with no abstraction layer or any type of lazy loading.
>   */
> -struct pkg_operations default_pkg_ops = {
> +const struct pkg_operations default_pkg_ops = {
>  	.get_base        = _pkg_get_base,
>  	.get_desc        = _pkg_get_desc,
>  	.get_url         = _pkg_get_url,
> diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h
> index c37bd11e..b134ad5a 100644
> --- a/lib/libalpm/package.h
> +++ b/lib/libalpm/package.h
> @@ -83,7 +83,7 @@ struct pkg_operations {
>   * The actual definition is in package.c so it can have access to the
>   * default accessor functions which are defined there.
>   */
> -extern struct pkg_operations default_pkg_ops;
> +extern const struct pkg_operations default_pkg_ops;
>  
>  struct __alpm_pkg_t {
>  	unsigned long name_hash;
> @@ -121,7 +121,7 @@ struct __alpm_pkg_t {
>  	alpm_list_t *removes; /* in transaction targets only */
>  	alpm_pkg_t *oldpkg; /* in transaction targets only */
>  
> -	struct pkg_operations *ops;
> +	const struct pkg_operations *ops;
>  
>  	alpm_filelist_t files;
>  
> 


More information about the pacman-dev mailing list