apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Stoddard" <b...@wstoddard.com>
Subject Re: Buckets code question
Date Wed, 11 Apr 2001 18:45:48 GMT
Much better. Macros are like C++ multiple inheritance. There are times and
places for them but generally you are better off without them :-)

Bill

> On Wed, 11 Apr 2001 rbb@covalent.net wrote:
>
> > > #define apr_bucket_do_create(ap__b,do_make)     \
> > >     do {                                        \
> > >         apr_bucket *b;                          \
> > >         b = calloc(1, sizeof(*b));              \
> > >         ap__b = do_make;                        \
> > >         APR_RING_ELEM_INIT(ap__b, link);        \
> > >     } while(0)
> >
> > +1
>
> Upon further inspection, the also magical apr_bucket *b is also now
> unnecessary since ap__b is no longer tested for NULL.  So
> apr_bucket_do_create() collapses even further down to just:
>
> #define apr_bucket_do_create(ap__b,do_make)     \
>     do {                                        \
>         ap__b = calloc(1, sizeof(*ap__b));      \
>         ap__b = do_make;                        \
>         APR_RING_ELEM_INIT(ap__b, link);        \
>     } while(0)
>
> And callers do something like this:
>
> {
>     apr_bucket *b;
>
>     apr_bucket_do_create(b, apr_bucket_foo_make(b, foo));
>     return b;
> }
>
> But this is screwy for two reasons: the double assignments to ap__b in the
> macro and the seeming call to rv = apr_bucket_foo_make(b, foo) BEFORE
> calling apr_bucket_do_create(b, rv) (if apr_bucket_do_create() were a
> function).
>
> It seems to me that apr_bucket_do_create() has outlived its usefulness.
> It's only a few lines long at this point, which are less tricky-looking
> when done inline than when done as a macro.  So what I'm going to do
> unless someone objects strongly is to nix it altogether and just do this:
>
>
> #define APR_BUCKET_INIT(b)  APR_RING_ELEM_INIT((b), link)
>
> APU_DECLARE(apr_bucket *) apr_bucket_foo_create(apr_foo_t *foo)
> {
>     apr_bucket *b = (apr_bucket *)calloc(1, sizeof(*b));
>
>     APR_BUCKET_INIT(b);
>     return apr_bucket_foo_make(b, foo);
> }
>
>
> Note that I've switched the effective order of APR_BUCKET_INIT() and
> apr_bucket_foo_make, but it shouldn't matter since the two never touch
> each other's data (and if they did, it would be better for the init to
> happen first anyway).
>
> --Cliff
>
>
> --------------------------------------------------------------
>    Cliff Woolley
>    cliffwoolley@yahoo.com
>    Charlottesville, VA
>
>


Mime
View raw message