[ccan] [PATCH 2/4] jset: Use TCON_WRAP instead of TCON

Rusty Russell rusty at rustcorp.com.au
Mon Jul 31 16:25:14 AEST 2017


OK, these all look good.

Please apply!
Rusty.

David Gibson <david at gibson.dropbear.id.au> writes:
> TCON() uses flexible-array members which aren't allowed in the middle
> of structures, except as a gcc extension.  TCON_WRAP() avoids this and so
> is more portable.
>
> This doesn't change the jset interface, only its internals.
>
> Signed-off-by: David Gibson <david at gibson.dropbear.id.au>
> ---
>  ccan/jset/jset.h     | 45 ++++++++++++++++++++++++++++-----------------
>  ccan/jset/test/run.c |  9 +++++----
>  2 files changed, 33 insertions(+), 21 deletions(-)
>
> diff --git a/ccan/jset/jset.h b/ccan/jset/jset.h
> index ba72f097..904982d6 100644
> --- a/ccan/jset/jset.h
> +++ b/ccan/jset/jset.h
> @@ -30,8 +30,7 @@ struct jset {
>   *	};
>   */
>  #define JSET_MEMBERS(type)			\
> -	struct jset raw;			\
> -	TCON(type canary)
> +	TCON_WRAP(struct jset, type canary) jset_
>  
>  /**
>   * jset_new - create a new, empty jset.
> @@ -47,6 +46,14 @@ struct jset {
>   */
>  #define jset_new(type) ((type *)jset_new_(sizeof(type)))
>  
> +
> +/**
> + * jset_raw_ - unwrap the typed set (without type checking)
> + * @set: the typed jset
> + */
> +#define jset_raw_(set)	(tcon_unwrap(&(set)->jset_))
> +
> +
>  /**
>   * jset_free - destroy a jset.
>   * @set: the set returned from jset_new.
> @@ -54,7 +61,7 @@ struct jset {
>   * Example:
>   *	jset_free(set);
>   */
> -#define jset_free(set) jset_free_(&(set)->raw)
> +#define jset_free(set) jset_free_(jset_raw_(set))
>  
>  /**
>   * jset_error - test for an error in the a previous jset_ operation.
> @@ -74,8 +81,8 @@ struct jset {
>   *	if (errstr)
>   *		errx(1, "Woah, error on newly created set?! %s", errstr);
>   */
> -#define jset_error(set) \
> -	jset_error_(&(set)->raw)
> +#define jset_error(set) jset_error_(jset_raw_(set))
> +
>  
>  /**
>   * jset_raw - unwrap the typed set and check the type
> @@ -86,7 +93,9 @@ struct jset {
>   * variable is of an unexpected type.  It is used internally where we
>   * need to access the raw underlying jset.
>   */
> -#define jset_raw(set, expr) (&tcon_check((set), canary, (expr))->raw)
> +#define jset_raw(set, expr) \
> +	(tcon_unwrap(tcon_check(&(set)->jset_, canary, (expr))))
> +
>  
>  /**
>   * jset_test - test a bit in the bitset.
> @@ -137,8 +146,8 @@ struct jset {
>   *	// We expect 1000 entries.
>   *	assert(jset_count(set) == 1000);
>   */
> -#define jset_count(set)				\
> -	jset_popcount_(&(set)->raw, 0, -1UL)
> +#define jset_count(set)	\
> +	jset_popcount_(jset_raw_(set), 0, -1UL)
>  
>  /**
>   * jset_popcount - get population of (some part of) bitset.
> @@ -186,7 +195,7 @@ struct jset {
>   *	}
>   */
>  #define jset_nth(set, n, invalid)					\
> -	tcon_cast((set), canary,					\
> +	tcon_cast(&(set)->jset_, canary,				\
>  		  jset_nth_(jset_raw((set), (invalid)),			\
>  			    (n), (unsigned long)(invalid)))
>  
> @@ -205,7 +214,7 @@ struct jset {
>   *	printf("\n");
>   */
>  #define jset_first(set)						\
> -	tcon_cast((set), canary, jset_first_(&(set)->raw))
> +	tcon_cast(&(set)->jset_, canary, jset_first_(jset_raw_(set)))
>  
>  /**
>   * jset_next - return the next bit which is set (must not contain 0).
> @@ -216,7 +225,8 @@ struct jset {
>   * jset_first.
>   */
>  #define jset_next(set, prev)						\
> -	tcon_cast((set), canary, jset_next_(&(set)->raw, (unsigned long)(prev)))
> +	tcon_cast(&(set)->jset_, canary,				\
> +		  jset_next_(jset_raw_(set), (unsigned long)(prev)))
>  
>  /**
>   * jset_last - return the last bit which is set (must not contain 0).
> @@ -230,7 +240,7 @@ struct jset {
>   *	printf("\n");
>   */
>  #define jset_last(set)						\
> -	tcon_cast((set), canary, jset_last_(&(set)->raw))
> +	tcon_cast(&(set)->jset_, canary, jset_last_(jset_raw_(set)))
>  
>  /**
>   * jset_prev - return the previous bit which is set (must not contain 0).
> @@ -241,7 +251,8 @@ struct jset {
>   * jset_last.
>   */
>  #define jset_prev(set, prev)						\
> -	tcon_cast((set), canary, jset_prev_(&(set)->raw, (unsigned long)(prev)))
> +	tcon_cast(&(set)->jset_, canary,				\
> +		  jset_prev_(jset_raw_(set), (unsigned long)(prev)))
>  
>  /**
>   * jset_first_clear - return the first bit which is unset
> @@ -251,17 +262,17 @@ struct jset {
>   * set is full.
>   */
>  #define jset_first_clear(set)						\
> -	tcon_cast((set), canary, jset_next_clear_(&(set)->raw, 0))
> +	tcon_cast(&(set)->jset_, canary, jset_next_clear_(jset_raw_(set), 0))
>  
>  #define jset_next_clear(set, prev)					\
> -	tcon_cast((set), canary, jset_next_clear_(&(set)->raw,		\
> +	tcon_cast(&(set)->jset_, canary, jset_next_clear_(jset_raw_(set), \
>  						  (unsigned long)(prev)))
>  
>  #define jset_last_clear(set)					\
> -	tcon_cast((set), canary, jset_last_clear_(&(set)->raw))
> +	tcon_cast(&(set)->jset_, canary, jset_last_clear_(jset_raw_(set)))
>  
>  #define jset_prev_clear(set, prev)					\
> -	tcon_cast((set), canary, jset_prev_clear_(&(set)->raw,		\
> +	tcon_cast(&(set)->jset_, canary, jset_prev_clear_(jset_raw_(set), \
>  						  (unsigned long)(prev)))
>  
>  /* Raw functions */
> diff --git a/ccan/jset/test/run.c b/ccan/jset/test/run.c
> index a0fb8a8c..425546fd 100644
> --- a/ccan/jset/test/run.c
> +++ b/ccan/jset/test/run.c
> @@ -34,7 +34,8 @@ int main(int argc, char *argv[])
>  		jset_set(set, 1 + (i << 4));
>  
>  	/* This only take 1.7MB on my 32-bit system. */
> -	diag("%u bytes memory used\n", (unsigned)Judy1MemUsed(set->raw.judy));
> +	diag("%u bytes memory used\n",
> +	     (unsigned)Judy1MemUsed(jset_raw_(set)->judy));
>  
>  	ok1(jset_popcount(set, 0, -1) == 1000000);
>  	ok1(jset_nth(set, 0, -1) == 1);
> @@ -53,13 +54,13 @@ int main(int argc, char *argv[])
>  	ok1(jset_error(set) == NULL);
>  
>  	/* Test error handling */
> -	JU_ERRNO(&set->raw.err) = 100;
> -	JU_ERRID(&set->raw.err) = 991;
> +	JU_ERRNO(&jset_raw_(set)->err) = 100;
> +	JU_ERRID(&jset_raw_(set)->err) = 991;
>  	err = jset_error(set);
>  	ok1(err);
>  	ok1(strstr(err, "100"));
>  	ok1(strstr(err, "991"));
> -	ok1(err == set->raw.errstr);
> +	ok1(err == jset_raw_(set)->errstr);
>  	jset_free(set);
>  
>  	return exit_status();
> -- 
> 2.13.3


More information about the ccan mailing list