Skip to content

Commit

Permalink
fix: Destroy preload managers on player destroy (#6576)
Browse files Browse the repository at this point in the history
A PreloadManager can only be used on the Player instance that created
it. That means that once that Player instance is destroyed any
PreloadManagers it made are basically useless, so they should be
automatically destroyed too.
  • Loading branch information
theodab committed May 10, 2024
1 parent 91daf87 commit 265784e
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions lib/player.js
Expand Up @@ -715,6 +715,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.manifestFilterer_ = new shaka.media.ManifestFilterer(
this.config_, this.maxHwRes_, null);

/** @private {!Array.<shaka.media.PreloadManager>} */
this.createdPreloadManagers_ = [];

/** @private {shaka.util.Stats} */
this.stats_ = null;

Expand Down Expand Up @@ -881,6 +884,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget {

await detachPromise;

// A PreloadManager can only be used with the Player instance that created
// it, so all PreloadManagers this Player has created are now useless.
// Destroy any remaining managers now, to help prevent memory leaks.
const preloadManagerDestroys = [];
for (const preloadManager of this.createdPreloadManagers_) {
if (!preloadManager.isDestroyed()) {
preloadManagerDestroys.push(preloadManager.destroy());
}
}
await Promise.all(preloadManagerDestroys);
this.createdPreloadManagers_ = [];

// Tear-down the event managers to ensure handlers stop firing.
if (this.globalEventManager_) {
this.globalEventManager_.release();
Expand Down Expand Up @@ -1977,6 +1992,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
};
preloadManager = new shaka.media.PreloadManager(
assetUri, mimeType, startTimeOfLoad, startTime, playerInterface);
this.createdPreloadManagers_.push(preloadManager);
return preloadManager;
}

Expand Down

0 comments on commit 265784e

Please sign in to comment.