[Top][All Lists]
[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.
- GSIMap, David Chisnall, 2011/06/01