Re: [PATCH v3 12/16] Closures

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2012-05-25 at 13:25 -0700, Kent Overstreet wrote:
> Asynchronous refcounty thingies; they embed a refcount and a work
> struct. Extensive documentation follows in include/linux/closure.h
[]
> diff --git a/include/linux/closure.h b/include/linux/closure.h
[]
> +enum closure_type {
> +	TYPE_closure				= 0,

I still think these should be
	CLOSURE_TYPE_closure
etc.

> +#define __CLOSURE_TYPE(cl, _t)						\
> +	  __builtin_types_compatible_p(typeof(cl), struct _t)		\
> +		? TYPE_ ## _t :						\
	CLOSURE_TYPE_##_t

> +#define __closure_type(cl)						\
> +(									\
> +	__CLOSURE_TYPE(cl, closure)					\
> +	__CLOSURE_TYPE(cl, closure_with_waitlist)			\
> +	__CLOSURE_TYPE(cl, closure_with_timer)				\
> +	__CLOSURE_TYPE(cl, closure_with_waitlist_and_timer)		\
> +	invalid_closure_type()						\
> +)

You should still feel dirty about this...

> +#define continue_at(_cl, _fn, _wq, ...)					\
> +do {									\
> +	BUG_ON(!(_cl) || object_is_on_stack(_cl));			\
> +	closure_set_ip(_cl);						\
> +	set_closure_fn(_cl, _fn, _wq);					\
> +	closure_sub(_cl, CLOSURE_RUNNING + 1);				\
> +	return __VA_ARGS__;						\
> +} while (0)

Does this have to be a macro?

> diff --git a/lib/closure.c b/lib/closure.c
[]
> +#define CL_FIELD(type, field)					\
> +	case TYPE_ ## type:					\
> +	return &container_of(cl, struct type, cl)->field
> +
> +static struct closure_waitlist *closure_waitlist(struct closure *cl)
> +{
> +	switch (cl->type) {
> +		CL_FIELD(closure_with_waitlist, wait);
> +		CL_FIELD(closure_with_waitlist_and_timer, wait);
> +	default:
> +		return NULL;
> +	}
> +}

Here:

static struct closure_waitlist *closure_waitlist(struct closure *cl)
{
	switch (cl->type) {
	case CLOSURE_TYPE_closure_with_waitlist:
		return &container_of(cl, struct closure_with_waitlist, cl)->wait;
	case CLOSURE_TYPE_closure_with_waitlist_and_timer:
		return &container_of(cl, struct closure_with_waitlist_and_timer, cl)->wait;
	}

	return NULL;
}


--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux