浏览代码

Better JitsiTrack#dispose() method to prevent memory leaks

master
tsareg 9 年前
父节点
当前提交
06cf23ff61
共有 4 个文件被更改,包括 25 次插入8 次删除
  1. 8
    4
      modules/RTC/JitsiLocalTrack.js
  2. 0
    2
      modules/RTC/JitsiRemoteTrack.js
  3. 10
    2
      modules/RTC/JitsiTrack.js
  4. 7
    0
      modules/RTC/RTCUtils.js

+ 8
- 4
modules/RTC/JitsiLocalTrack.js 查看文件

@@ -37,7 +37,6 @@ function JitsiLocalTrack(stream, track, mediaType, videoType, resolution,
37 37
     this.resolution = resolution;
38 38
     this.deviceId = deviceId;
39 39
     this.startMuted = false;
40
-    this.disposed = false;
41 40
     this.initialMSID = this.getMSID();
42 41
     this.inMuteOrUnmuteProgress = false;
43 42
 
@@ -251,6 +250,7 @@ JitsiLocalTrack.prototype._setMute = function (mute, resolve, reject) {
251 250
                     }
252 251
 
253 252
                     if(!streamInfo) {
253
+                        // FIXME: introduce new JitsiTrackError for that
254 254
                         reject(new Error('track.no_stream_found'));
255 255
                         return;
256 256
                     }
@@ -287,9 +287,12 @@ JitsiLocalTrack.prototype._setMute = function (mute, resolve, reject) {
287 287
 /**
288 288
  * Stops sending the media track. And removes it from the HTML.
289 289
  * NOTE: Works for local tracks only.
290
+ *
291
+ * @extends JitsiTrack#dispose
290 292
  * @returns {Promise}
291 293
  */
292 294
 JitsiLocalTrack.prototype.dispose = function () {
295
+    var self = this;
293 296
     var promise = Promise.resolve();
294 297
 
295 298
     if (this.conference){
@@ -301,8 +304,6 @@ JitsiLocalTrack.prototype.dispose = function () {
301 304
         this.detach();
302 305
     }
303 306
 
304
-    this.disposed = true;
305
-
306 307
     RTCUtils.removeListener(RTCEvents.DEVICE_LIST_CHANGED,
307 308
         this._onDeviceListChanged);
308 309
 
@@ -311,7 +312,10 @@ JitsiLocalTrack.prototype.dispose = function () {
311 312
             this._onAudioOutputDeviceChanged);
312 313
     }
313 314
 
314
-    return promise;
315
+    return promise
316
+        .then(function() {
317
+            return JitsiTrack.prototype.dispose.call(self);
318
+        });
315 319
 };
316 320
 
317 321
 /**

+ 0
- 2
modules/RTC/JitsiRemoteTrack.js 查看文件

@@ -84,6 +84,4 @@ JitsiRemoteTrack.prototype._setVideoType = function (type) {
84 84
     this.eventEmitter.emit(JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED, type);
85 85
 };
86 86
 
87
-delete JitsiRemoteTrack.prototype.dispose;
88
-
89 87
 module.exports = JitsiRemoteTrack;

+ 10
- 2
modules/RTC/JitsiTrack.js 查看文件

@@ -71,6 +71,8 @@ function JitsiTrack(conference, stream, track, streamInactiveHandler, trackMedia
71 71
     this.track = track;
72 72
     this.videoType = videoType;
73 73
 
74
+    this.disposed = false;
75
+
74 76
     if(stream) {
75 77
         if (RTCBrowserType.isFirefox()) {
76 78
             implementOnEndedHandling(this);
@@ -208,10 +210,16 @@ JitsiTrack.prototype.detach = function (container) {
208 210
 };
209 211
 
210 212
 /**
211
- * Dispose sending the media track. And removes it from the HTML.
212
- * NOTE: Works for local tracks only.
213
+ * Removes attached event listeners.
214
+ *
215
+ * @returns {Promise}
213 216
  */
214 217
 JitsiTrack.prototype.dispose = function () {
218
+    this.eventEmitter.removeAllListeners();
219
+
220
+    this.disposed = true;
221
+
222
+    return Promise.resolve();
215 223
 };
216 224
 
217 225
 /**

+ 7
- 0
modules/RTC/RTCUtils.js 查看文件

@@ -1101,6 +1101,13 @@ var RTCUtils = {
1101 1101
             mediaStream.stop();
1102 1102
         }
1103 1103
 
1104
+        // MediaStream in react-native-webrtc implementation has special
1105
+        // "release" method to do the clean up of memory. We use it to prevent
1106
+        // memory leaks.
1107
+        if (mediaStream.release) {
1108
+            mediaStream.release();
1109
+        }
1110
+
1104 1111
         // if we have done createObjectURL, lets clean it
1105 1112
         var url = mediaStream.jitsiObjectURL;
1106 1113
         if (url) {

正在加载...
取消
保存