Browse Source

Some simple mitigation against of double release

pull/19045/head
Max Katz 8 months ago
parent
commit
8826fc7382
  1. 21
      src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs

21
src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Threading;
using Android.Content; using Android.Content;
using Android.Graphics; using Android.Graphics;
using Android.Runtime; using Android.Runtime;
@ -64,12 +65,18 @@ namespace Avalonia.Android
private void CacheSurfaceProperties(ISurfaceHolder holder) private void CacheSurfaceProperties(ISurfaceHolder holder)
{ {
ReleaseNativeWindowHandle();
var surface = holder?.Surface; var surface = holder?.Surface;
var newHandle = IntPtr.Zero;
if (surface?.Handle is { } handle) if (surface?.Handle is { } handle)
_nativeWindowHandle = AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, handle); {
else newHandle = AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, handle);
_nativeWindowHandle = IntPtr.Zero; }
if (Interlocked.Exchange(ref _nativeWindowHandle, newHandle) is var oldHandle
&& oldHandle != IntPtr.Zero)
{
AndroidFramebuffer.ANativeWindow_release(oldHandle);
}
var frame = holder?.SurfaceFrame; var frame = holder?.SurfaceFrame;
_size = frame != null ? new PixelSize(frame.Width(), frame.Height()) : new PixelSize(1, 1); _size = frame != null ? new PixelSize(frame.Width(), frame.Height()) : new PixelSize(1, 1);
@ -78,10 +85,10 @@ namespace Avalonia.Android
private void ReleaseNativeWindowHandle() private void ReleaseNativeWindowHandle()
{ {
if (_nativeWindowHandle != IntPtr.Zero) if (Interlocked.Exchange(ref _nativeWindowHandle, IntPtr.Zero) is var oldHandle
&& oldHandle != IntPtr.Zero)
{ {
AndroidFramebuffer.ANativeWindow_release(_nativeWindowHandle); AndroidFramebuffer.ANativeWindow_release(oldHandle);
_nativeWindowHandle = IntPtr.Zero;
} }
} }
} }

Loading…
Cancel
Save