Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fix event listener leaks in Player #4229

Merged
merged 1 commit into from May 17, 2022

Conversation

joeyparrish
Copy link
Member

Event listeners were being leaked in Player across load() / unload()
cycles. This was fundamentally caused by the difficulty in keeping
track of which event listeners to clean up at which stages of the load
graph. Everything is cleaned up by Player.destroy() and
EventManager.release(), but for a Player with heavy re-use, there was
still a small leak.

This fixes the leak by splitting the EventManager instance into three
instances, each of which is cleaned up in a different part of the load
graph life cycle. Listeners which should only live as long as a piece
of content is loaded go into loadEventManager_. Listeners which
should only live as long as we are attached to the video element go
into attachEventManager_. Listeners which should live as long as the
Player instance itself go into globalEventManager_. It is now
impossible to miss unlistening to a particular event, since we no
longer have to unlisten to any individual events at all. The
removeAll() method of each event manager will clean up all listeners
at the appropriate time.

Event listeners were being leaked in Player across load() / unload()
cycles.  This was fundamentally caused by the difficulty in keeping
track of which event listeners to clean up at which stages of the load
graph.  Everything is cleaned up by Player.destroy() and
EventManager.release(), but for a Player with heavy re-use, there was
still a small leak.

This fixes the leak by splitting the EventManager instance into three
instances, each of which is cleaned up in a different part of the load
graph life cycle.  Listeners which should only live as long as a piece
of content is loaded go into loadEventManager_.  Listeners which
should only live as long as we are attached to the video element go
into attachEventManager_.  Listeners which should live as long as the
Player instance itself go into globalEventManager_.  It is now
impossible to miss unlistening to a particular event, since we no
longer have to unlisten to any individual events at all.  The
removeAll() method of each event manager will clean up all listeners
at the appropriate time.
@joeyparrish joeyparrish requested a review from theodab May 16, 2022 23:16
@avelad avelad added the type: bug Something isn't working correctly label May 17, 2022
@avelad avelad added this to the v4.1 milestone May 17, 2022
@avelad avelad self-requested a review May 17, 2022 10:50
@joeyparrish joeyparrish merged commit a5d3568 into shaka-project:main May 17, 2022
@joeyparrish joeyparrish deleted the fix-listener-leak branch May 17, 2022 15:37
joeyparrish added a commit that referenced this pull request May 17, 2022
Event listeners were being leaked in Player across load() / unload()
cycles.  This was fundamentally caused by the difficulty in keeping
track of which event listeners to clean up at which stages of the load
graph.  Everything is cleaned up by Player.destroy() and
EventManager.release(), but for a Player with heavy re-use, there was
still a small leak.

This fixes the leak by splitting the EventManager instance into three
instances, each of which is cleaned up in a different part of the load
graph life cycle.  Listeners which should only live as long as a piece
of content is loaded go into loadEventManager_.  Listeners which
should only live as long as we are attached to the video element go
into attachEventManager_.  Listeners which should live as long as the
Player instance itself go into globalEventManager_.  It is now
impossible to miss unlistening to a particular event, since we no
longer have to unlisten to any individual events at all.  The
removeAll() method of each event manager will clean up all listeners
at the appropriate time.
joeyparrish added a commit that referenced this pull request May 17, 2022
Event listeners were being leaked in Player across load() / unload()
cycles.  This was fundamentally caused by the difficulty in keeping
track of which event listeners to clean up at which stages of the load
graph.  Everything is cleaned up by Player.destroy() and
EventManager.release(), but for a Player with heavy re-use, there was
still a small leak.

This fixes the leak by splitting the EventManager instance into three
instances, each of which is cleaned up in a different part of the load
graph life cycle.  Listeners which should only live as long as a piece
of content is loaded go into loadEventManager_.  Listeners which
should only live as long as we are attached to the video element go
into attachEventManager_.  Listeners which should live as long as the
Player instance itself go into globalEventManager_.  It is now
impossible to miss unlistening to a particular event, since we no
longer have to unlisten to any individual events at all.  The
removeAll() method of each event manager will clean up all listeners
at the appropriate time.
joeyparrish added a commit that referenced this pull request May 17, 2022
Event listeners were being leaked in Player across load() / unload()
cycles.  This was fundamentally caused by the difficulty in keeping
track of which event listeners to clean up at which stages of the load
graph.  Everything is cleaned up by Player.destroy() and
EventManager.release(), but for a Player with heavy re-use, there was
still a small leak.

This fixes the leak by splitting the EventManager instance into three
instances, each of which is cleaned up in a different part of the load
graph life cycle.  Listeners which should only live as long as a piece
of content is loaded go into loadEventManager_.  Listeners which
should only live as long as we are attached to the video element go
into attachEventManager_.  Listeners which should live as long as the
Player instance itself go into globalEventManager_.  It is now
impossible to miss unlistening to a particular event, since we no
longer have to unlisten to any individual events at all.  The
removeAll() method of each event manager will clean up all listeners
at the appropriate time.
nyanmisaka added a commit to nyanmisaka/shaka-player that referenced this pull request Oct 6, 2022
@github-actions github-actions bot added the status: archived Archived and locked; will not be updated label Jul 25, 2023
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jul 25, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
status: archived Archived and locked; will not be updated type: bug Something isn't working correctly
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants