[M3devel] Re: RTHooks CheckStoreTraced and CheckLoadTraced

Darko darko at darko.org
Thu Apr 19 04:49:29 CEST 2007


Thanks, that's very helpful. I agree I shouldn't need it but it's  
exactly because I'm not using the compiler is why I need to know  
about it. The code is attached, it's still in development and  
unfinished but you'll get the idea.

Basically the module allows you to programatically access structure  
fields. It allows for applications like being able to create indexes  
(using an adaptation of the Table code) of objects using arbitrary  
fields as keys. It makes dynamic programming a bit more dynamic. The  
code is intended to be completely safe, but there's more checks I  
need to do.



-------------- next part --------------
A non-text attachment was scrubbed...
Name: InType.m3
Type: application/octet-stream
Size: 41052 bytes
Desc: not available
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20070419/dd7fc86b/attachment-0004.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: InType.i3
Type: application/octet-stream
Size: 6117 bytes
Desc: not available
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20070419/dd7fc86b/attachment-0005.obj>
-------------- next part --------------




On 19/04/2007, at 4:05 AM, Tony Hosking wrote:

>
> On Apr 18, 2007, at 9:37 PM, Darko wrote:
>
>> Not actually using that code, but I did see your helpful commit on  
>> it some time ago. It seems that the problem I described earlier is  
>> due to another bug. The code I'm working on does a lot of reading  
>> and writing of traced references and I was hoping to get a better  
>> understanding of situations I need to be aware of and how to use  
>> those RTHooks calls more efficiently.
>
> You SHOULD NOT need to use these calls so long as you are accessing  
> using properly typed references (as in my example earlier).  This  
> is not an issue for SAFE code, only in UNSAFE modules must you be  
> careful how you use LOOPHOLE to cast references.
>
>> So say I have two traced objects and I am copying a traced  
>> reference from a field in one to the other. What set of calls  
>> would be normally required there?
>
> How are you copying the references?  I would like to see your code  
> for this.  So long as you properly type things then the calls to  
> RTHooks.CheckLoadTracedRef and RTHooks.CheckStoreTraced will be  
> generated by the compiler.
>
> Anyway...
>
> RTHooks.CheckLoadTracedRef is generated by the compiler whenever  
> you access a traced reference in memory (e.g., via dereference or  
> from a shared variable).  Its job is to prevent mutators from  
> acquiring references to "gray" objects (that are reachable but  
> still to be scanned for the traced references that they contain).   
> The check turns the object from gray to black by scanning its  
> references and making sure none of them refer to white objects  
> (that are not known to be reachable by the collector).
>
> RTHooks.CheckStoreTraced is generated by the compiler whenever a  
> traced reference is stored (or might be stored, e.g., for VAR) into  
> a traced object.  The check makes sure that the generational GC  
> knows that the object has been modified.  It needs to know this for  
> objects in the older genration.
>
> Again, I reiterate that it is not my intention that programmers  
> actually call these runtime hooks explicitly!  I am certain I can  
> rewrite any code you might have so that you do not need to call  
> them explicitly.  Instead, properly typed references will result in  
> the checks being generated for you by the compiler.  Please feel  
> free to send me code snippets for review.
>
>> I'm sure you haven't got time to go into the minutiae of the  
>> runtime system, but any hints would be appreciated.
>>
>> Cheers,
>> Darko.
>>
>>
>> On 18/04/2007, at 4:34 PM, Tony Hosking wrote:
>>
>>> I assume you have an apply method for your RTTypeMap.Visitor that  
>>> takes "field: ADDRESS" and treats it as "REF REFANY".   This is  
>>> wrong.  When reading a REF field you should use the following idiom:
>>>
>>> WITH ref = LOOPHOLE(field, UNTRACED REF REFANY) DO
>>>   ... access field via ref^ ...
>>> END;
>>>
>>> This will automatically insert a call to the appropriate runtime  
>>> routines on accessing the reference field.
>>>
>>> There should be no need for you to call the runtime routines  
>>> directly.
>>>
>>> On Apr 17, 2007, at 9:51 PM, Darko wrote:
>>>
>>>> Hi,
>>>>
>>>> Wondering if you can explain the use of these calls a little  
>>>> more. I'm currently using type maps to read and write fields  
>>>> from traced objects. Reading a traced reference from inside a  
>>>> traced object into a local variable is not working as it should.  
>>>> Should I use CheckLoadTraced and if so when and how? Looking at  
>>>> your changes to RTTypeMap, writing references into objects means  
>>>> you need to call CheckStoreTraced on the object written inside  
>>>> of, before it is written?
>>>>
>>>> Cheers,
>>>> Darko.
>>>
>



More information about the M3devel mailing list