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