apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Cliff Woolley <jwool...@virginia.edu>
Subject Re: A question about rings.
Date Tue, 27 Aug 2002 23:42:28 GMT
On Tue, 27 Aug 2002, Gregory (Grisha) Trubetskoy wrote:

> In other words, instead of
>
> #define APR_RING_SENTINEL(hp, elem, link)                               \
>     (struct elem *)((char *)(hp) - APR_OFFSETOF(struct elem, link))
>
> Why not:
>
> #define APR_RING_SENTINEL(hp, elem)                               \
>     (struct elem *)(hp)
>
> It so happens that the APR_RING_ENTRY is always first in the element
> structure, and so the offset is 0 which is why it works (and the macros
> above yeld same result). But it seems to me that if the APR_RING_ENTRY
> was't first, then the result of APR_RING_SENTINEL could be a pointer to
> somewhere before beginning of head, or some place within head but before
> APR_RING_HEAD, which could be some arbitrary and not necessarily constant
> value.

That's in fact exactly the point.  The sentinel value is not really to be
thought of as a pointer to anything in particular... it's just a magic
number.  A ring element structure can be set up so that each element can
be on more than one ring at a time.  In that case, each of the rings
attached to any given head needs a unique sentinel value.  So while it's
true that this is hardly ever used and is optimized away, it's there just
in case somebody wants to use it.

Make more sense?

--Cliff


Mime
View raw message