Would we consider just pulling in concurrencykit? We'll get this and many other composed primitives from an active community for free. On Mar 8, 2013 12:49 AM, "John Plevyak" <jplev...@gmail.com> wrote:
> 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 > > >