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