[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