gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GSIMap


From: Richard Frith-Macdonald
Subject: Re: GSIMap
Date: Thu, 2 Jun 2011 06:28:50 +0100

On 1 Jun 2011, at 23:48, David Chisnall wrote:

> On 1 Jun 2011, at 23:20, Richard Frith-Macdonald wrote:
> 
>> 
>> On 1 Jun 2011, at 19:30, David Chisnall wrote:
>> 
>>> Hi,
>>> 
>>> I'm trying to make NSHashTable / NSMapTable use the correct read / write 
>>> barrier functions in GC mode, but I don't really understand the GSIMap 
>>> code.  Does it define macros for reading / writing pointers anywhere?  In 
>>> GC mode, we need to call the relevant read and write barrier functions for 
>>> assigning pointer values, depending in the pointer functions:
>> 
>> NSHashTable and NSMapTable use both NSPointerFunctions and the old callbacks 
>> (Apple added new classes for these objects, while retaining backward 
>> compatibility with the old API)... see NSConcretePointerFunctions.[hm] for 
>> the new functions  and the CallBacks files for the old ones.
>> 
>> If you look at the actual hash/map table code (eg NSConcreteHashTable.m) you 
>> will see the defines which tell GSIMAP which versions to use.
>> eg.
>> #define GSI_MAP_RETAIN_KEY(M, X)\
>> (M->legacy ? M->cb.old.retain(M, X.ptr) \
>> : pointerFunctionsAcquire(&M->cb.pf, &X.ptr, X.ptr))
> 
> I am not sure this helps.  The GSIMap code seems to do things like:
> 
> GSI_MAP_RETAIN_KEY(map, node->key)
> node->key = key;
> 
> This is actually wrong in retain / release mode (-retain is not guaranteed to 
> return self),

The guarantee is that it's specifically documented to do so in the protocol 
.... see 
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html
So any implementation of -retain which doesn't return self is faulty, and the 
programmer really deserves any error they have introduced by 
overriding/replacing the default one.

> but in GC mode, these two lines need to somehow become:
> 
> objc_assign_strongCast(key, &(node->key));\
> 
> there also doesn't seem to be any macro for reading the keys.  For example, 
> when ever you read node->key or node->value as a weak pointer, lines like:
> 
> GSI_MAP_EQUAL(map, node->key, key)
> 
> Need to be expanded to something like:
> 
> [objc_read_weak(&(node->key) isEqual: key]

Then we need some modification for if/when we support non-boehm GC.

The current sequence:

node->key = key;
GSI_MAP_RETAIN_KEY(map, node->key);

could become:

GSI_MAP_ACQUIRE_KEY(map, &key_in_node, key);

and we could trivially add a macro to reference the map content.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]