Uploaded image for project: 'MediaPortal 2'
  1. MediaPortal 2
  2. MP2-872

DynamicResourceExtension is not thread safe and can crash the main render loop

    XMLWordPrintable

Details

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • 2.4
    • 2.3.2
    • Skin Engine
    • None

    Description

      <p>Under some circumstances the DynamicResourceExtension can crash the main render loop if it's attached resources/properties&nbsp;are updated whilst being disposed. Implement a lock in the same way as BindingExtension does.</p>

      <p>Stacktrace of crash</p>

      <p>[DX Render] [ERROR] - SkinEngine MainForm: Main render loop crashed<br>
      System.InvalidOperationException: Collection was modified; enumeration operation may not execute.<br>
      &nbsp; &nbsp;at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)<br>
      &nbsp; &nbsp;at System.Collections.Generic.List`1.Enumerator.MoveNextRare()<br>
      &nbsp; &nbsp;at System.Collections.Generic.List`1.Enumerator.MoveNext()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.ResetEventHandlerAttachments()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Dispose()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.DisposeBindings()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetValueInRenderThread(IDataDescriptor dataDescriptor, Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetBindingValue(IDataDescriptor dd, Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget(Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.UpdateTarget()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MarkupExtensions.DynamicResourceExtension.Activate()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.ActivateBindings()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.PropertyChangedHandler.Invoke(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Setter.Set(UIElement element)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.UpdateSettersAndCollectTriggers(UIElement element, ICollection`1 finishedProperties, ICollection`1 triggers)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Styles.Style.Set(UIElement element)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.UpdateStyle(Style oldStyle)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.FrameworkElement.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.ContentControl.OnUpdateElementState()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.set_ElementState(ElementState value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.SetElementStateAction.Execute(UIElement element)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.ForEachElementInTree_BreadthFirst(IUIElementAction action)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.UIElement.SetElementState(ElementState state)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateControlChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.set_TemplateControl(FrameworkElement value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Controls.Visuals.Control.OnTemplateChanged(AbstractProperty property, Object oldValue)<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.SProperty.Fire(Object oldValue) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\SProperty.cs:line 73<br>
      &nbsp; &nbsp;at MediaPortal.Common.General.AbstractProperty.SetValue(Object value) in F:\Git\mediaportal\MediaPortal-2\MediaPortal\Source\Core\MediaPortal.Common\General\AbstractProperty.cs:line 121<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.Xaml.DependencyPropertyDataDescriptor.set_Value(Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.MpfElements.DependencyObject.SetDataDescriptorValueWithLP(IDataDescriptor dd, Object value)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.ScreenManagement.Animator.SetValues()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.ScreenManagement.Screen.SetValues()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.ScreenManagement.ScreenManager.Render()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.DirectX.RenderPipelines.AbstractRenderPipeline.Render()<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.DirectX.GraphicsDevice.Render(Boolean doWaitForNextFame)<br>
      &nbsp; &nbsp;at MediaPortal.UI.SkinEngine.GUI.MainForm.RenderLoop()</p>

      Attachments

        Activity

          People

            brownard Brownard
            brownard Brownard
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: