Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Print error when EventEmitters get too many listeners

  • Loading branch information...
commit bdb1464fbced4eda55f7cda255c3e36f7cc6d74d 1 parent 5b81897
@ry ry authored
Showing with 40 additions and 1 deletion.
  1. +8 −0 doc/api/events.markdown
  2. +32 −1 lib/events.js
View
8 doc/api/events.markdown
@@ -61,6 +61,14 @@ Remove a listener from the listener array for the specified event.
Removes all listeners from the listener array for the specified event.
+#### emitter.setMaxListeners(n)
+
+By default EventEmitters will print a warning if more than 10 listeners are
+added to it. This is a useful default which helps finding memory leaks.
+Obviously not all Emitters should be limited to 10. This function allows
+that to be increased. Set to zero for unlimited.
+
+
#### emitter.listeners(event)
Returns an array of listeners for the specified event. This array can be
View
33 lib/events.js
@@ -1,7 +1,18 @@
var EventEmitter = exports.EventEmitter = process.EventEmitter;
-
var isArray = Array.isArray;
+// By default EventEmitters will print a warning if more than
+// 10 listeners are added to it. This is a useful default which
+// helps finding memory leaks.
+//
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+var defaultMaxListeners = 10;
+EventEmitter.prototype.setMaxListeners = function(n) {
+ this._events.maxListeners = n;
+};
+
+
EventEmitter.prototype.emit = function(type) {
// If there is no 'error' event listener then throw.
if (type === 'error') {
@@ -71,6 +82,26 @@ EventEmitter.prototype.addListener = function(type, listener) {
// Optimize the case of one listener. Don't need the extra array object.
this._events[type] = listener;
} else if (isArray(this._events[type])) {
+
+ // Check for listener leak
+ if (!this._events[type].warned) {
+ var m;
+ if (this._events.maxListeners !== undefined) {
+ m = this._events.maxListeners;
+ } else {
+ m = defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ console.trace();
+ }
+ }
+
// If we've already got an array, just append.
this._events[type].push(listener);
} else {
Please sign in to comment.
Something went wrong with that request. Please try again.