Disregard this question, it's not doing what I originally expected it
was doing based on the name.

Brian

On Wed, Sep 5, 2012 at 8:45 PM, Brian Geffon <bri...@apache.org> wrote:
> Hi,
> I was curious if anyone could shed some light on the following
> question I've had. So if I understand this correctly the freelists use
> the upper 16bits of the data ptr to be a "version," where this version
> tries to solve several problems related to lockfree data structures
> including the ABA problem and the delete after remove problem. So in
> my quest to understand these more, I'm trying to figure why the macros
> are so complex, for example:
>
> #define FREELIST_POINTER(_x) ((void*)(((((intptr_t)(_x).data)<<16)>>16) | \
>  (((~((((intptr_t)(_x).data)<<16>>63)-1))>>48)<<48)))
>
> Since the pointer is just the lower 48 bits, isn't it enough to just
> do something like:
>
> (void*)(((intptr_t)(_x).data) & (intptr_t)(0x0000FFFFFFFFFFFFULL)))
>
> It would seem like we should be able to pull this off with only a
> single machine instruction? Which is surprising that we dont when the
> freelist version macro is much simpler:
>
> #define FREELIST_VERSION(_x) (((intptr_t)(_x).data)>>48)
>
> I know some pretty smart people worked on this stuff so I'm sure there
> is a very good reason for the complexity, but I just cant figure it
> out. Anyone?
>
> Brian

Reply via email to