Collection Object

Shaun Wexler dev at macfoh.com
Thu Aug 3 04:02:43 CDT 2006


On Aug 3, 2006, at 2:46 AM, Shaun Wexler wrote:

> The approach I would like to take for the forthcoming Valentina 3  
> versions is to toll-free bridge the C++ FBL classes with CF/NS.  I  
> know can do it!  I have the power...  ;)

The major differences between CF/NS and FBL I_Unknown is in the  
reference counting... and in Tiger/Leopard: auto-garbage-collection.

By default there is no inline refcount contained in the base NSObject  
itself; it carries an implied 1 refcount, and all additional  
references are stored in one large maptable keyed by the object's id  
pointer, and the dict is protected by one common spinlock (ack!!  
0-1000 iterations before blocking!).  This is one reason that retain/ 
release is so expensive in NS, and why all CF and many other NS "hot"  
objects are designed with an inline refcount ivar, just like all FBL  
classes (and SKW classes!).

Each API has its own way of implementing the refcounting functions or  
methods, but they all work the same.  CFRuntimeBase declares an  
object struct which is compatible with NSObject, allowing toll-free  
bridging, because ObjC is so immensely flexible, CF actually creates  
subclasses of the NS class and then poses as the NS class, replacing  
certain method IMP's with its own.

CF objects encode some useful information; isa is the actual NS class  
which has been "patched", and then it stores 32 bits of additional  
allocation data as follows: 7 bits of inline refcount plus 1 bit to  
indicate overflows which are stored in an external dict, similar to  
NS except that it is 32768 times faster.  It also stores 8 bits for  
the CFTypeID which is an index into the CF class table (yes, max of  
255 runtime CF classes).  One bit is used to flag the default system  
allocator, and I think the other 7 bits are unused.  The fields are  
designed so the full 32 bit value can be loaded at once and masked,  
regardless of endianness of the arch.

When an object refcount needs accessed, first a type determination is  
conducted, and the real methods are dispatched for bridged classes if  
necessary, and this is duplicated again for the CF layer... yes,  
twice redundant.

Thus, each CF object requires 8 bytes, and each NS object which is  
NOT toll-free bridged only requires 4 bytes **.  Plus ivars for  
subclasses, etc.  ** Moot point, since minimum malloc granularity is  
16 bytes and is always 16-byte aligned (SKWObject requires native  
cacheline size/alignment).

So if we design I_Unknown to use this 64-bit "bridge" header, and all  
bridged classes follow the same conventions, we can build another  
bridge and then VKernel, etc, can use the classes transparently and  
we can also pass them directly to NS and CF.

::)
-- 
Shaun Wexler
MacFOH
http://www.macfoh.com




More information about the Valentina mailing list