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-bcache" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to