In my ObjC->Mono bridge I have been using the Boehm collector and pinned memory 
(as an expedient).
I now want to move to SGEN and moveable memory.
As a first step I have switched to SGEN and left pinning enabled.

My ObjC code wraps a MonoObject * in an NSObject.
When the MonoObject is set it is pinned.
A simple monoObjectTrace property watches to see if the MonoObject moves.

Under the Boehm collector objects seem to stay pinned as requested.
Under SGEN they don’t i.e.: the exception in the second method below raises 
i.e.:  self.monoObjectTrace != (NSUInteger)monoObject) 

What am I doing wrong?

I do want to migrate to moveable memory support ASAP but a step wise approach 
seems best.

#define DB_TRACE_MONO_OBJECT_ADDRESS

- (void)setMonoObject:(MonoObject *)monoObject
{
    if (_mono_gchandle) {
        NSLog(@"calling mono_gchandle_free!");
        mono_gchandle_free(_mono_gchandle);
        _mono_gchandle = 0;
    }
    
    // we don't want to persist the monoObject in an ivar or on the heap in 
general as it would
    // require always pinning the pointed to MonoObject
    if (monoObject) {
        _mono_gchandle = mono_gchandle_new(monoObject, 
self.monoEnvironment.pinGCHandles);
    }
    
#ifdef DB_TRACE_MONO_OBJECT_ADDRESS
    self.monoObjectTrace = (NSUInteger)monoObject;
#endif
    
}

- (MonoObject *)monoObject
{
    // This pointer should be valid while it is visible on the unmanaged stack.
    // Dont save it into the heap as it may become invalid if the MonoObject is 
not pinned
    // and the managed instance gets moved in memory.
    MonoObject *monoObject = mono_gchandle_get_target(_mono_gchandle);
    
#ifdef DB_TRACE_MONO_OBJECT_ADDRESS
    if (self.monoObjectTrace != (NSUInteger)monoObject) {
        [NSException raise:@"Managed object has moved" format:@"Support for 
moved managed objects is pending."];
    }
#endif
    
    return monoObject;
}

Jonathan










_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to