Skip to content

Conversation

@fredjk-gh
Copy link
Collaborator

In PluginManager:

  • Strip suffixes of semantic versioned plugins (ie. -beta) using a regex. It doesn't contribute to the actual versioning. The built-in version parser does not handle this, so just strip it.

In PluginList:

  • Wrap the building of the plugin list UI in the TableLayoutPanel with SuspendLayout() / ResumeLayout() to improve performance.
  • Avoid random layout engine failures (ie. index-out-of-bounds and null dereference errors) resulting from lack of thread safety in the layout engine caused by running multiple threads which manipulate the plugin list. I was able to consistently reproduce this with 4 plugins triggering an update to the plugin list before my fix, and cannot trigger it now. See screenshot for visual of broken UI that results. Instead of firing the update-check tasks immediately during main layout of the plugin list, collect the tasks un-started and run them one at a time on a separate non-blocking task after completing the layout of the plugin list UI. These update check tasks may take slightly longer due to running serially, it should not be noticeable because they should not block the main thread.

Note the misplaced update label at the top of the PluginList:
image

In PluginManager:
   * Strip suffixes of semantic versioned plugins (ie. `-beta`) using a regex. It doesn't contribute to the actual versioning. The built-in version parser does not handle this, so just strip it.

In PluginList:
   * Wrap the building of the plugin list UI in the TableLayoutPanel with SuspendLayout() / ResumeLayout() to improve performance.
   * Avoid random layout engine failures (ie. index-out-of-bounds and null dereference errors) resulting from lack of thread safety in the layout engine caused by running multiple threads which manipulate the plugin list. I was able to consistently reproduce this with 4 plugins triggering an update to the plugin list before my fix, and cannot trigger it now. See screenshot for visual of broken UI that results. Instead of firing the update-check tasks immediately during main layout of the plugin list, collect the tasks **un-started** and run them one at a time on a separate non-blocking task after completing the layout of the plugin list UI. These update check tasks may take slightly longer due to running serially, it should not be noticeable because they should not block the main thread.
@fredjk-gh fredjk-gh added the Core label Dec 24, 2025
@fredjk-gh fredjk-gh requested a review from Xjph as a code owner December 24, 2025 03:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant