I'll take a look.  I was thinking we should make this move.  Glad to see
it.
On Mar 7, 2013 9:13 PM, "Brian Geffon" <bri...@apache.org> wrote:

> Hello all,
>
> So to those of you familiar with the freelists you know that it works this
> way the head pointer uses the upper 16 bits for a version to prevent the
> ABA problem. The big drawback to this is that it requires the following
> NASTY macros to get at the pointer or the version:
>
> #define FREELIST_POINTER(_x) ((void*)(((((intptr_t)(_x).data)<<16)>>16) | \
> (((~((((intptr_t)(_x).data)<<16>>63)-1))>>48)<<48))) // sign extend
> #define FREELIST_VERSION(_x) (((intptr_t)(_x).data)>>48)
> #define SET_FREELIST_POINTER_VERSION(_x,_p,_v) \
> (_x).data = ((((intptr_t)(_p))&0x0000FFFFFFFFFFFFULL) | (((_v)&0xFFFFULL)
> << 48))
>
> Additionally, since this only leaves 16 bits it limits the number of
> versions you can have. Well more and more x86_64 processors support DCAS
> (double word compare and swap / 128bit CAS). This means that we can use
> 64bits for a version which basically makes the versions unlimited but more
> importantly it takes those macros above and simplifies them to:
>
> #define FREELIST_POINTER(_x) (_x).s.pointer
> #define FREELIST_VERSION(_x) (_x).s.version
> #define SET_FREELIST_POINTER_VERSION(_x,_p,_v) \
> (_x).s.pointer = _p; (_x).s.version = _v
>
> As you can imagine this will have a performance improvement, in my simple
> tests I measured a performance improvement of around 6%. As of now I
> haven't tried doing this with reclaimable freelists, but if this proves
> fruitful maybe I can work with the taobao guys to make sure it wont have
> problems with their stuff.
>
> This freelist stuff can be very tricky, so I'll ask anyone who is
> interested or understands this code to please review these changes and most
> importantly performance test it to make sure this makes. Patch is uploaded
> to the ticket: https://issues.apache.org/jira/browse/TS-1742
>
> Thanks
> Brian
>

Reply via email to