-
Notifications
You must be signed in to change notification settings - Fork 63
Description
Context: Xamarin.Android Bug 25443
The problem is that it is often desirable to dispose of handles ASAP because you "know" that the instances won't be used anymore:
using (var typeface = Typeface.Create (...)) {
// use typeface
}
The problem is that the above code is making an assumption that Typeface.Create() will be returning a new, unique, instance. If it doesn't (as is actually the case), then the returned wrapper could be shared with other threads, and if the handle is Dispose()d while another thread is using it...Bad Things™ happen.
Addressing this involves two parts; see Issue #4 for the second half.
The first half involves adding another "primitive" operation: in addition to JavaVM.GetValue() (Issue #2), we should have JavaVM.CreateValue() methods which always create a new, possibly aliasing, wrapper instance (if a wrapper would be used, e.g. vm.CreateValue<int>(...) clearly doesn't involve a wrapper...).
We would thus have two ways to turn a JNI handle into a value:
JavaVM.GetValue()to maintain object identity semantics, maintaining a single wrapper instance per encountered Java instance.JavaVM.CreateValue(), which always creates a new wrapper (when required), allowing the caller to alwaysDispose()of it.