[Red5commits] [1255] Applied patch of tracker #103 - Events should support reference counting.
sgong
luke at codegent.com
Wed Aug 2 07:00:13 EDT 2006
Applied patch of tracker #103 - Events should support reference counting.
Timestamp: 08/02/06 20:56:18 (less than one hour ago)
Change: 1255
Author: sgong
Files (see diff or trac for details):
java/server/trunk/src/org/red5/server/net/rtmp/event/AllocationDebugger.java
java/server/trunk/src/org/red5/server/net/rtmp/event/AudioData.java
java/server/trunk/src/org/red5/server/net/rtmp/event/BaseEvent.java
java/server/trunk/src/org/red5/server/net/rtmp/event/BytesRead.java
java/server/trunk/src/org/red5/server/net/rtmp/event/ChunkSize.java
java/server/trunk/src/org/red5/server/net/rtmp/event/ClientBW.java
java/server/trunk/src/org/red5/server/net/rtmp/event/IRTMPEvent.java
java/server/trunk/src/org/red5/server/net/rtmp/event/Notify.java
java/server/trunk/src/org/red5/server/net/rtmp/event/Ping.java
java/server/trunk/src/org/red5/server/net/rtmp/event/ServerBW.java
java/server/trunk/src/org/red5/server/net/rtmp/event/Unknown.java
java/server/trunk/src/org/red5/server/net/rtmp/event/VideoData.java
java/server/trunk/src/org/red5/server/so/SharedObjectMessage.java
Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1255
Index: /java/server/trunk/src/org/red5/server/so/SharedObjectMessage.java
===================================================================
--- /java/server/trunk/src/org/red5/server/so/SharedObjectMessage.java (revision 1094)
+++ /java/server/trunk/src/org/red5/server/so/SharedObjectMessage.java (revision 1255)
@@ -104,4 +104,9 @@
return getEvents();
}
+
+ @Override
+ protected void releaseInternal() {
+
+ }
public String toString(){
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/ServerBW.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/ServerBW.java (revision 1133)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/ServerBW.java (revision 1255)
@@ -26,3 +26,8 @@
}
+ @Override
+ protected void releaseInternal() {
+
+ }
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/Unknown.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/Unknown.java (revision 1082)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/Unknown.java (revision 1255)
@@ -49,11 +49,12 @@
return sb.toString();
}
-
- public void release() {
+
+ @Override
+ protected void releaseInternal() {
if (data != null) {
data.release();
data = null;
}
- super.release();
}
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/VideoData.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/VideoData.java (revision 1122)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/VideoData.java (revision 1255)
@@ -75,10 +75,11 @@
}
- public void release() {
+ @Override
+ protected void releaseInternal() {
if (data != null) {
data.release();
data = null;
}
- super.release();
}
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/BytesRead.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/BytesRead.java (revision 1124)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/BytesRead.java (revision 1255)
@@ -49,3 +49,8 @@
}
+ @Override
+ protected void releaseInternal() {
+
+ }
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/ChunkSize.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/ChunkSize.java (revision 1082)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/ChunkSize.java (revision 1255)
@@ -55,3 +55,8 @@
}
+ @Override
+ protected void releaseInternal() {
+
+ }
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/ClientBW.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/ClientBW.java (revision 1133)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/ClientBW.java (revision 1255)
@@ -1,5 +1,3 @@
package org.red5.server.net.rtmp.event;
-
-import org.red5.server.api.event.IEvent.Type;
public class ClientBW extends BaseEvent {
@@ -37,3 +35,9 @@
return "ClientBW: "+bandwidth+" value2: "+value2;
}
+
+ @Override
+ protected void releaseInternal() {
+
+ }
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/Notify.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/Notify.java (revision 1111)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/Notify.java (revision 1255)
@@ -107,10 +107,11 @@
}
- public void release() {
+ @Override
+ protected void releaseInternal() {
if (data != null) {
data.release();
data = null;
}
- super.release();
}
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/AllocationDebugger.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/AllocationDebugger.java (revision 1255)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/AllocationDebugger.java (revision 1255)
@@ -0,0 +1,94 @@
+package org.red5.server.net.rtmp.event;
+
+/*
+ * RED5 Open Source Flash Server - http://www.osflash.org/red5
+ *
+ * Copyright (c) 2006 by respective authors (see below). All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 2.1 of the License, or (at your option) any later
+ * version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this library; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Simple allocation debugger for Event reference counting.
+ * @author The Red5 Project (red5 at osflash.org)
+ * @author Steven Gong (steven.gong at gmail.com) on behalf of (ce at publishing-etc.de)
+ */
+public class AllocationDebugger {
+
+ private class Info {
+
+ public int refcount;
+
+ public Info() {
+ refcount = 1;
+ }
+
+ }
+
+ private static AllocationDebugger instance;
+
+ public static AllocationDebugger getInstance() {
+ if (instance == null) instance = new AllocationDebugger();
+ return instance;
+ }
+
+ private Log log;
+
+ private Map<BaseEvent,Info> events;
+
+ private AllocationDebugger() {
+ log = LogFactory.getLog(getClass().getName());
+ events = new HashMap<BaseEvent,Info>();
+ }
+
+ protected synchronized void create(BaseEvent event) {
+ events.put(event,new Info());
+ }
+
+ protected synchronized void retain(BaseEvent event) {
+ Info info = events.get(event);
+ if(info != null) {
+ info.refcount++;
+ } else {
+ log.warn("Retain called on already released event.");
+ }
+ }
+
+ protected synchronized void release(BaseEvent event) {
+ Info info = events.get(event);
+ if (info != null) {
+ info.refcount--;
+ if (info.refcount == 0) {
+ events.remove(event);
+ }
+ } else {
+ log.warn("Release called on already released event.");
+ }
+ }
+
+ public synchronized void dump() {
+ log.debug("dumping allocations "+events.size());
+ for (Entry<BaseEvent, Info> entry : events.entrySet()) {
+ log.debug(entry.getKey() + " " + entry.getValue().refcount);
+ }
+ }
+
+}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/AudioData.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/AudioData.java (revision 1082)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/AudioData.java (revision 1255)
@@ -49,10 +49,11 @@
}
- public void release() {
+ @Override
+ protected void releaseInternal() {
if (data != null) {
data.release();
data = null;
}
- super.release();
}
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/BaseEvent.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/BaseEvent.java (revision 1094)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/BaseEvent.java (revision 1255)
@@ -25,4 +25,8 @@
public abstract class BaseEvent implements Constants, IRTMPEvent {
+ // XXX we need a better way to inject allocation debugging
+ // (1) make it configurable in xml
+ // (2) make it aspect oriented
+ private static final boolean allocationDebugging = false;
private Type type;
@@ -31,4 +35,5 @@
protected int timestamp;
protected Header header = null;
+ protected int refcount = 1;
public BaseEvent(Type type) {
@@ -39,4 +44,5 @@
this.type = type;
this.source = source;
+ if(allocationDebugging) AllocationDebugger.getInstance().create(this);
}
@@ -79,6 +85,20 @@
}
- public void release() {
-
+ public synchronized void retain() {
+ if (allocationDebugging) AllocationDebugger.getInstance().retain(this);
+ if (refcount > 0) {
+ refcount++;
+ }
}
+
+ public synchronized void release() {
+ if (allocationDebugging) AllocationDebugger.getInstance().release(this);
+ if (refcount > 0) {
+ refcount--;
+ if (refcount == 0) releaseInternal();
+ }
+ }
+
+ protected abstract void releaseInternal();
+
}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/IRTMPEvent.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/IRTMPEvent.java (revision 1094)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/IRTMPEvent.java (revision 1255)
@@ -38,4 +38,6 @@
public void setTimestamp(int timestamp);
+ public void retain();
+
/**
* Hook to free buffers allocated by the event.
Index: /java/server/trunk/src/org/red5/server/net/rtmp/event/Ping.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/event/Ping.java (revision 1132)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/event/Ping.java (revision 1255)
@@ -108,5 +108,5 @@
this.debug = debug;
}
-
+
protected void doRelease() {
value1 = 0;
@@ -120,3 +120,8 @@
}
+ @Override
+ protected void releaseInternal() {
+
+ }
+
}
Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.
More information about the Red5commits
mailing list