Revision: d5e0b67bcb26
Author: unknown <yulian@Venera.(none)>
Date: Sat Jan 12 12:37:26 2013
Log: Updated scheduler
Changed to use Unsafe.park and not object.wait
http://code.google.com/p/mediaserver/source/detail?r=d5e0b67bcb26
Modified:
/client/jsr-309/tck/deps/mgcp-driver-3.0.0.FINAL-SNAPSHOT.jar
/client/jsr-309/tck/media/decreasingvolume-recorded.wav
/client/jsr-309/tck/server.log
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/MessageHandler.java
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/TransactionHandler.java
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/stack/JainMgcpStackImpl.java
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/ConcurrentLinkedList.java
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/PacketRepresentation.java
/component/src/main/java/org/mobicents/media/server/component/audio/AudioComponent.java
/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
/component/src/main/java/org/mobicents/media/server/component/audio/AudioSplitter.java
/component/src/main/java/org/mobicents/media/server/component/oob/OOBComponent.java
/component/src/main/java/org/mobicents/media/server/component/oob/OOBMixer.java
/component/src/main/java/org/mobicents/media/server/component/oob/OOBSplitter.java
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/controller/Request.java
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/pkg/au/Play.java
/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
/resources/recorder/src/main/java/org/mobicents/media/server/impl/resource/audio/AudioRecorderImpl.java
/scheduler/src/main/java/org/mobicents/media/server/scheduler/ConcurrentLinkedList.java
/scheduler/src/main/java/org/mobicents/media/server/scheduler/IntConcurrentLinkedList.java
/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
=======================================
--- /client/jsr-309/tck/deps/mgcp-driver-3.0.0.FINAL-SNAPSHOT.jar Tue Jan
1 16:15:51 2013
+++ /client/jsr-309/tck/deps/mgcp-driver-3.0.0.FINAL-SNAPSHOT.jar Sat Jan
12 12:37:26 2013
Binary file, no diff available.
=======================================
--- /client/jsr-309/tck/media/decreasingvolume-recorded.wav Sat Jan 5
09:44:27 2013
+++ /client/jsr-309/tck/media/decreasingvolume-recorded.wav Sat Jan 12
12:37:26 2013
Binary file, no diff available.
=======================================
--- /client/jsr-309/tck/server.log Sat Jan 5 09:44:27 2013
+++ /client/jsr-309/tck/server.log Sat Jan 12 12:37:26 2013
@@ -1,6 +1,6 @@
-2013-01-05 18:58:05,329 DEBUG [TestBase] (main) Loading
file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties
-2013-01-05 18:58:05,335 INFO [Runner] (main) Start
mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play
javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6
javadoc::Player::1 javadoc::PlayerEvent::15
-2013-01-05 18:58:05,335 DEBUG [TestBase] (main) Getting a MsControlFactory
instance
-2013-01-05 18:58:05,357 INFO [DriverImpl] (main) Initializing MGCP on
/127.0.0.1:2729
-2013-01-05 18:58:05,370 WARN [JainMgcpStackImpl] (main) Failed to locate
properties file, using default values
-2013-01-05 18:58:05,380 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack
bound to IP /127.0.0.1 and UDP port 2729
+2013-01-12 21:52:51,813 DEBUG [TestBase] (main) Loading
file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties
+2013-01-12 21:52:51,815 INFO [Runner] (main) Start
mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play
javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6
javadoc::Player::1 javadoc::PlayerEvent::15
+2013-01-12 21:52:51,815 DEBUG [TestBase] (main) Getting a MsControlFactory
instance
+2013-01-12 21:52:51,837 INFO [DriverImpl] (main) Initializing MGCP on
/127.0.0.1:2729
+2013-01-12 21:52:51,852 WARN [JainMgcpStackImpl] (main) Failed to locate
properties file, using default values
+2013-01-12 21:52:51,862 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack
bound to IP /127.0.0.1 and UDP port 2729
=======================================
---
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/MessageHandler.java
Sat Jan 5 09:44:27 2013
+++
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/MessageHandler.java
Sat Jan 12 12:37:26 2013
@@ -299,10 +299,6 @@
}
finally
{
- pr.setEndTime(System.currentTimeMillis());
- if(logger.isDebugEnabled())
- logger.debug("Tx ID:" + remoteTxIdIntegere + ",Received message time:"
+ pr.getReceiveTime() + ",parse start time:" + pr.getParseTime() + ",end
time:" + pr.getEndTime());
-
pr.release();
}
}
=======================================
---
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/TransactionHandler.java
Tue Jan 1 16:15:51 2013
+++
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/handlers/TransactionHandler.java
Sat Jan 12 12:37:26 2013
@@ -302,6 +302,8 @@
if(originalPacket!=null)
stack.releasePacket(originalPacket);
+
+ originalPacket=null;
}
/**
@@ -444,7 +446,6 @@
if(originalPacket==null)
originalPacket=stack.allocatePacket();
- originalPacket.setReceiveTime(System.currentTimeMillis());
originalPacket.setLength(encode(event,originalPacket.getRawData()));
InetSocketAddress inetSocketAddress = new InetSocketAddress(address,
port);
originalPacket.setRemoteAddress(inetSocketAddress);
@@ -453,7 +454,7 @@
resetTHISTTimerTask(false);
if (logger.isDebugEnabled())
- logger.debug("Send command event to " + address + ", message\n" + new
String(originalPacket.getRawData(),0,originalPacket.getLength()));
+ logger.debug("Send command event to " + address + "remote TX ID:" +
remoteTID + ", message\n" + new
String(originalPacket.getRawData(),0,originalPacket.getLength()));
countOfCommandRetransmitted++;
stack.send(originalPacket);
@@ -484,7 +485,6 @@
if(originalPacket==null)
originalPacket=stack.allocatePacket();
- originalPacket.setReceiveTime(System.currentTimeMillis());
originalPacket.setLength(encode(event,originalPacket.getRawData()));
InetSocketAddress inetSocketAddress = new
InetSocketAddress(remoteAddress, remotePort);
originalPacket.setRemoteAddress(inetSocketAddress);
=======================================
---
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/stack/JainMgcpStackImpl.java
Sat Jan 5 09:44:27 2013
+++
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/stack/JainMgcpStackImpl.java
Sat Jan 12 12:37:26 2013
@@ -315,7 +315,6 @@
public void send(PacketRepresentation pr)
{
- pr.setParseTime(System.currentTimeMillis());
outputQueue.offer(pr);
}
@@ -355,7 +354,6 @@
receiveBuffer.get(pr.getRawData(), 0, length);
pr.setLength(length);
pr.setRemoteAddress(address);
-
pr.setReceiveTime(System.currentTimeMillis());
inputQueue.offer(pr);
}
} while (this.address != null);
@@ -366,10 +364,6 @@
while((pr=outputQueue.poll())!=null)
{
try {
-
pr.setEndTime(System.currentTimeMillis());
- if(logger.isDebugEnabled())
- logger.debug("Accepted message time:" + pr.getReceiveTime()
+ "parse completed time:" + pr.getParseTime() + ",end time:" +
pr.getEndTime());
-
this.sendBuffer.clear();
this.sendBuffer.put(pr.getRawData(),0,pr.getLength());
this.sendBuffer.flip();
@@ -458,7 +452,6 @@
while(active)
try {
PacketRepresentation current=inputQueue.take();
-
current.setParseTime(System.currentTimeMillis());
messageHandler.scheduleMessages(current);
}
catch(Exception e)
=======================================
---
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/ConcurrentLinkedList.java
Tue Jan 1 16:15:51 2013
+++
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/ConcurrentLinkedList.java
Sat Jan 12 12:37:26 2013
@@ -30,6 +30,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.locks.LockSupport;
/**
*
* @author oifa yulian
@@ -145,6 +146,13 @@
releaseAccess();
return false;
}
+
+ if(notifierSize>0)
+ {
+ updateNotifier(value);
+ releaseAccess();
+ return true;
+ }
if(cacheSize==0)
//need new node
@@ -153,8 +161,8 @@
{
//obtain node from cache decrease cache size
tempNode=cacheHead.next;
- cacheHead.next=tempNode.next;
- cacheHead.next.previous=cacheHead;
+ tempNode.next.previous=cacheHead;
+ cacheHead.next=tempNode.next;
tempNode.element=value;
cacheSize--;
@@ -167,10 +175,7 @@
tempNode.next=tail;
tail.previous=tempNode;
size++;
-
- if(notifierSize>0)
- updateNotifier(value);
-
+
releaseAccess();
return true;
}
@@ -200,6 +205,13 @@
return false;
aquireAccess();
+
+ if(notifierSize>0)
+ {
+ updateNotifier(value);
+ releaseAccess();
+ return true;
+ }
if(cacheSize==0)
//need new node
@@ -208,8 +220,8 @@
{
//obtain node from cache decrease cache size
tempNode=cacheHead.next;
- cacheHead.next=tempNode.next;
- cacheHead.next.previous=cacheHead;
+ tempNode.next.previous=cacheHead;
+ cacheHead.next=tempNode.next;
tempNode.element=value;
cacheSize--;
@@ -223,9 +235,6 @@
tail.previous=tempNode;
size++;
- if(notifierSize>0)
- updateNotifier(value);
-
releaseAccess();
return true;
}
@@ -354,42 +363,29 @@
notifierTail.previous.next=tempNotifier;
tempNotifier.previous=notifierTail.previous;
- tempNotifier.next=notifierTail;
+ tempNotifier.next=notifierTail;
notifierTail.previous=tempNotifier;
notifierSize++;
+ tempNotifier.element=null;
+ tempNotifier.waitingThread=Thread.currentThread();
- while(size==0)
- {
- //release lock so others will be able to add
nodes and wait
- releaseAccess();
+ //release lock so others will be able to add nodes and
wait
+ releaseAccess();
+
+ while(tempNotifier.element==null)
+ LockSupport.park();
- synchronized(tempNotifier.lock)
- {
- try
- {
- tempNotifier.lock.wait();
- }
- catch(InterruptedException e)
- {
-
- }
- }
-
- aquireAccess();
-
- if(size!=0)
- {
- //take back notifier
-
tempNotifier.previous.next=tempNotifier.next;
-
tempNotifier.next.previous=tempNotifier.previous;
-
-
tempNotifier.next=notifierCacheHead.next;
-
notifierCacheHead.next.previous=tempNotifier;
- notifierCacheHead.next=tempNotifier;
- tempNotifier.previous=notifierCacheHead;
- cacheNotifierSize++;
- }
- }
+ aquireAccess();
+
+ tempNotifier.next=notifierCacheHead.next;
+ notifierCacheHead.next.previous=tempNotifier;
+ notifierCacheHead.next=tempNotifier;
+ tempNotifier.previous=notifierCacheHead;
+ cacheNotifierSize++;
+
+ E result=tempNotifier.element;
+ releaseAccess();
+ return result;
}
//disconnect from main list
@@ -439,57 +435,59 @@
tempNotifier.previous=notifierTail.previous;
tempNotifier.next=notifierTail;
- notifierTail.previous=tempNotifier;
+ notifierTail.previous=tempNotifier;
notifierSize++;
- while(size==0)
+ tempNotifier.element=null;
+ tempNotifier.waitingThread=Thread.currentThread();
+
+ //release lock so others will be able to add nodes and
wait
+ releaseAccess();
+
+ switch(unit)
{
- //release lock so others will be able to add
nodes and wait
- releaseAccess();
+ case SECONDS:
+ TimeUnit.SECONDS.toNanos(timeout);
+ break;
+ case MILLISECONDS:
+ TimeUnit.MILLISECONDS.toNanos(timeout);
+ break;
+ case MICROSECONDS:
+ TimeUnit.MICROSECONDS.toNanos(timeout);
+ break;
+ case NANOSECONDS:
+ LockSupport.parkNanos(timeout);
+ break;
+ }
- synchronized(tempNotifier.lock)
- {
- try {
- switch(unit)
- {
- case MICROSECONDS:
-
tempNotifier.lock.wait(timeout/1000L,(int)((timeout*1000L)%1000000L));
- break;
- case MILLISECONDS:
-
tempNotifier.lock.wait(timeout);
- break;
- case NANOSECONDS:
-
tempNotifier.lock.wait(timeout/1000000L,(int)(timeout%1000000L));
- break;
- case SECONDS:
-
tempNotifier.lock.wait(timeout*1000L);
- break;
- }
- }
- catch(InterruptedException e)
- {
-
- }
- }
+ aquireAccess();
- aquireAccess();
+ if(tempNotifier.element==null)
+ {
+ //take back notifier
+ tempNotifier.previous.next=tempNotifier.next;
+
tempNotifier.next.previous=tempNotifier.previous;
+
+ tempNotifier.next=notifierCacheHead.next;
+ notifierCacheHead.next.previous=tempNotifier;
+ notifierCacheHead.next=tempNotifier;
+ tempNotifier.previous=notifierCacheHead;
+ cacheNotifierSize++;
- if(size==0)
- {
- releaseAccess();
- throw new InterruptedException();
- }
+ releaseAccess();
+ throw new InterruptedException();
}
-
- //take back notifier
- tempNotifier.previous.next=tempNotifier.next;
- tempNotifier.next.previous=tempNotifier.previous;
tempNotifier.next=notifierCacheHead.next;
notifierCacheHead.next.previous=tempNotifier;
notifierCacheHead.next=tempNotifier;
tempNotifier.previous=notifierCacheHead;
cacheNotifierSize++;
+
+ E result=tempNotifier.element;
+ releaseAccess();
+
+ return result;
}
//disconnect from main list
@@ -715,15 +713,15 @@
private void updateNotifier(E newElement)
{
- if(notifierSize==0)
- return;
-
notifierSize--;
- Notifier tempNotifier=notifierHead.next;
- synchronized(tempNotifier.lock)
- {
- tempNotifier.lock.notify();
- }
+ Notifier tempNotifier=notifierHead.next;
+
+ //take back notifier
+ notifierHead.next=tempNotifier.next;
+ notifierHead.next.previous=notifierHead;
+
+ tempNotifier.element=newElement;
+ LockSupport.unpark(tempNotifier.waitingThread);
}
private void aquireAccess()
@@ -744,9 +742,10 @@
}
private class Notifier<E> {
- private Object lock=new Object();
Notifier next;
Notifier previous;
+ E element;
+ Thread waitingThread;
}
private class Node<E> {
=======================================
---
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/PacketRepresentation.java
Tue Jan 1 16:15:51 2013
+++
/client/mgcp/driver/src/main/java/org/mobicents/protocols/mgcp/utils/PacketRepresentation.java
Sat Jan 12 12:37:26 2013
@@ -47,9 +47,6 @@
private byte[] rawData = null;
private InetSocketAddress remoteAddress = null;
private int length = 0;
- private long receiveTime=0L;
- private long parseTime=0L;
- private long endTime=0L;
private PacketRepresentationFactory prFactory = null;
@@ -86,37 +83,9 @@
this.remoteAddress = remoteAddress;
}
- public long getReceiveTime() {
- return this.receiveTime;
- }
-
- public void setReceiveTime(long receiveTime) {
- this.receiveTime = receiveTime;
- }
-
- public long getParseTime() {
- return this.parseTime;
- }
-
- public void setParseTime(long parseTime) {
- this.parseTime = parseTime;
- }
-
- public long getEndTime() {
- return this.endTime;
- }
-
- public void setEndTime(long endTime) {
- this.endTime = endTime;
- }
-
public void release() {
this.prFactory.deallocate(this);
this.remoteAddress=null;
- this.length=0;
- this.receiveTime=0L;
- this.parseTime=0L;
- this.endTime=0L;
+ this.length=0;
}
-
}
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/audio/AudioComponent.java
Tue Jan 1 16:15:51 2013
+++
/component/src/main/java/org/mobicents/media/server/component/audio/AudioComponent.java
Sat Jan 12 12:37:26 2013
@@ -43,7 +43,10 @@
private IntConcurrentLinkedList<AudioInput> inputs = new
IntConcurrentLinkedList();
private IntConcurrentLinkedList<AudioOutput> outputs = new
IntConcurrentLinkedList();
-
+
+ private Iterator<AudioInput> activeInputs=inputs.iterator();
+ private Iterator<AudioOutput> activeOutputs=outputs.iterator();
+
protected Boolean shouldRead=false;
protected Boolean shouldWrite=false;
@@ -97,9 +100,9 @@
public void perform()
{
- first=true;
- Iterator<AudioInput> activeInputs=inputs.iterator();
- while(activeInputs.hasNext())
+ first=true;
+ inputs.resetIterator(activeInputs);
+ while(activeInputs.hasNext())
{
AudioInput input=activeInputs.next();
frame=input.poll();
@@ -157,8 +160,8 @@
frame.setDuration(period);
frame.setFormat(format);
- Iterator<AudioOutput> activeOutputs=outputs.iterator();
- while(activeOutputs.hasNext())
+ outputs.resetIterator(activeOutputs);
+ while(activeOutputs.hasNext())
{
AudioOutput output=activeOutputs.next();
if(!activeOutputs.hasNext())
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
Tue Jan 1 16:15:51 2013
+++
/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
Sat Jan 12 12:37:26 2013
@@ -48,6 +48,8 @@
//The pool of components
private IntConcurrentLinkedList<AudioComponent> components = new
IntConcurrentLinkedList();
+ Iterator<AudioComponent> activeComponents=components.iterator();
+
private long period = 20000000L;
private int packetSize = (int)(period / 1000000) *
format.getSampleRate()/1000 * format.getSampleSize() / 8;
@@ -124,7 +126,7 @@
public long perform() {
//summarize all
sourcesCount=0;
- Iterator<AudioComponent>
activeComponents=components.iterator();
+ components.resetIterator(activeComponents);
while(activeComponents.hasNext())
{
AudioComponent component=activeComponents.next();
@@ -171,7 +173,7 @@
total[i]=(short)Math.round((double) total[i] *
currGain);
//get data for each component
- activeComponents=components.iterator();
+ components.resetIterator(activeComponents);
while(activeComponents.hasNext())
{
AudioComponent component=activeComponents.next();
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/audio/AudioSplitter.java
Tue Jan 1 16:15:51 2013
+++
/component/src/main/java/org/mobicents/media/server/component/audio/AudioSplitter.java
Sat Jan 12 12:37:26 2013
@@ -49,6 +49,11 @@
private IntConcurrentLinkedList<AudioComponent> insideComponents = new
IntConcurrentLinkedList();
private IntConcurrentLinkedList<AudioComponent> outsideComponents =
new IntConcurrentLinkedList();
+ private Iterator<AudioComponent>
insideRIterator=insideComponents.iterator();
+ private Iterator<AudioComponent>
insideSIterator=insideComponents.iterator();
+
+ private Iterator<AudioComponent>
outsideRIterator=outsideComponents.iterator();
+ private Iterator<AudioComponent>
outsideSIterator=outsideComponents.iterator();
private long period = 20000000L;
private int packetSize = (int)(period / 1000000) *
format.getSampleRate()/1000 * format.getSampleSize() / 8;
@@ -144,10 +149,10 @@
public long perform() {
//summarize all
first=true;
- Iterator<AudioComponent>
activeComponents=insideComponents.iterator();
- while(activeComponents.hasNext())
+ insideComponents.resetIterator(insideRIterator);
+ while(insideRIterator.hasNext())
{
- AudioComponent component=activeComponents.next();
+ AudioComponent component=insideRIterator.next();
component.perform();
current=component.getData();
if(current!=null)
@@ -194,10 +199,10 @@
total[i]=(short)Math.round((double) total[i] *
currGain);
//get data for each component
- activeComponents=outsideComponents.iterator();
- while(activeComponents.hasNext())
+ outsideComponents.resetIterator(outsideSIterator);
+ while(outsideSIterator.hasNext())
{
- AudioComponent component=activeComponents.next();
+ AudioComponent component=outsideSIterator.next();
component.offer(total);
}
@@ -230,10 +235,10 @@
public long perform() {
//summarize all
first=true;
- Iterator<AudioComponent>
activeComponents=outsideComponents.iterator();
- while(activeComponents.hasNext())
+ outsideComponents.resetIterator(outsideRIterator);
+ while(outsideRIterator.hasNext())
{
- AudioComponent component=activeComponents.next();
+ AudioComponent component=outsideRIterator.next();
component.perform();
current=component.getData();
if(current!=null)
@@ -278,10 +283,10 @@
total[i]=(short)Math.round((double) total[i] *
currGain);
//get data for each component
- activeComponents=insideComponents.iterator();
- while(activeComponents.hasNext())
+ insideComponents.resetIterator(insideSIterator);
+ while(insideSIterator.hasNext())
{
- AudioComponent component=activeComponents.next();
+ AudioComponent component=insideSIterator.next();
component.offer(total);
}
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/oob/OOBComponent.java
Fri Jan 4 03:50:24 2013
+++
/component/src/main/java/org/mobicents/media/server/component/oob/OOBComponent.java
Sat Jan 12 12:37:26 2013
@@ -42,6 +42,9 @@
private IntConcurrentLinkedList<OOBInput> inputs = new
IntConcurrentLinkedList();
private IntConcurrentLinkedList<OOBOutput> outputs = new
IntConcurrentLinkedList();
+ Iterator<OOBInput> activeInputs=inputs.iterator();
+ Iterator<OOBOutput> activeOutputs=outputs.iterator();
+
protected Boolean shouldRead=false;
protected Boolean shouldWrite=false;
@@ -87,8 +90,8 @@
public void perform()
{
frame=null;
- Iterator<OOBInput> activeInputs=inputs.iterator();
- while(activeInputs.hasNext())
+ inputs.resetIterator(activeInputs);
+ while(activeInputs.hasNext())
{
OOBInput input=activeInputs.next();
frame=input.poll();
@@ -118,7 +121,7 @@
return;
}
- Iterator<OOBOutput> activeOutputs=outputs.iterator();
+ outputs.resetIterator(activeOutputs);
while(activeOutputs.hasNext())
{
OOBOutput output=activeOutputs.next();
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/oob/OOBMixer.java
Fri Jan 4 03:50:24 2013
+++
/component/src/main/java/org/mobicents/media/server/component/oob/OOBMixer.java
Sat Jan 12 12:37:26 2013
@@ -45,6 +45,8 @@
//The pool of components
private IntConcurrentLinkedList<OOBComponent> components = new
IntConcurrentLinkedList();
+ Iterator<OOBComponent> activeComponents=components.iterator();
+
private MixTask mixer;
private volatile boolean started = false;
@@ -99,8 +101,8 @@
public long perform() {
//summarize all
- Iterator<OOBComponent> activeComponents=components.iterator();
- while(activeComponents.hasNext())
+ components.resetIterator(activeComponents);
+ while(activeComponents.hasNext())
{
OOBComponent component=activeComponents.next();
component.perform();
@@ -120,8 +122,8 @@
}
//get data for each component
- activeComponents=components.iterator();
- while(activeComponents.hasNext())
+ components.resetIterator(activeComponents);
+ while(activeComponents.hasNext())
{
OOBComponent component=activeComponents.next();
if(component.getComponentId()!=sourceComponent)
=======================================
---
/component/src/main/java/org/mobicents/media/server/component/oob/OOBSplitter.java
Fri Jan 4 03:50:24 2013
+++
/component/src/main/java/org/mobicents/media/server/component/oob/OOBSplitter.java
Sat Jan 12 12:37:26 2013
@@ -46,6 +46,12 @@
private IntConcurrentLinkedList<OOBComponent> insideComponents = new
IntConcurrentLinkedList();
private IntConcurrentLinkedList<OOBComponent> outsideComponents = new
IntConcurrentLinkedList();
+ private Iterator<OOBComponent>
insideRIterator=insideComponents.iterator();
+ private Iterator<OOBComponent>
insideSIterator=insideComponents.iterator();
+
+ private Iterator<OOBComponent>
outsideRIterator=outsideComponents.iterator();
+ private Iterator<OOBComponent>
outsideSIterator=outsideComponents.iterator();
+
private InsideMixTask insideMixer;
private OutsideMixTask outsideMixer;
private volatile boolean started = false;
@@ -115,10 +121,10 @@
public long perform() {
//summarize all
current=null;
- Iterator<OOBComponent>
activeComponents=insideComponents.iterator();
- while(activeComponents.hasNext())
+ insideComponents.resetIterator(insideRIterator);
+ while(insideRIterator.hasNext())
{
- OOBComponent component=activeComponents.next();
+ OOBComponent component=insideRIterator.next();
component.perform();
current=component.getData();
if(current!=null)
@@ -133,11 +139,12 @@
}
//get data for each component
- activeComponents=outsideComponents.iterator();
- while(activeComponents.hasNext())
+ outsideComponents.resetIterator(outsideSIterator);
+
+ while(outsideSIterator.hasNext())
{
- OOBComponent component=activeComponents.next();
- if(!activeComponents.hasNext())
+ OOBComponent component=outsideSIterator.next();
+ if(!outsideSIterator.hasNext())
component.offer(current);
else
component.offer(current.clone());
@@ -165,10 +172,10 @@
public long perform() {
//summarize all
current=null;
- Iterator<OOBComponent>
activeComponents=outsideComponents.iterator();
- while(activeComponents.hasNext())
+ outsideComponents.resetIterator(outsideRIterator);
+ while(outsideRIterator.hasNext())
{
- OOBComponent component=activeComponents.next();
+ OOBComponent component=outsideRIterator.next();
component.perform();
current=component.getData();
if(current!=null)
@@ -183,11 +190,11 @@
}
//get data for each component
- activeComponents=insideComponents.iterator();
- while(activeComponents.hasNext())
+ insideComponents.resetIterator(insideSIterator);
+ while(insideSIterator.hasNext())
{
- OOBComponent component=activeComponents.next();
- if(!activeComponents.hasNext())
+ OOBComponent component=insideSIterator.next();
+ if(!insideSIterator.hasNext())
component.offer(current);
else
component.offer(current.clone());
=======================================
---
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/controller/Request.java
Wed Jul 25 12:00:02 2012
+++
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/controller/Request.java
Sat Jan 12 12:37:26 2013
@@ -139,8 +139,10 @@
public void execute() {
if (!executors.isEmpty()) {
currentSignal = executors.poll();
- currentSignal.execute();
- }
+
+ if(currentSignal!=null)
+ currentSignal.execute();
+ }
}
public void onEvent(Text event) {
=======================================
---
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/pkg/au/Play.java
Sat Sep 15 16:38:09 2012
+++
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/pkg/au/Play.java
Sat Jan 12 12:37:26 2013
@@ -172,10 +172,11 @@
}
private void terminate() {
- if (player != null) {
- player.removeListener(this);
- player.deactivate();
- player=null;
+ Player currPlayer=player;
+ if (currPlayer != null) {
+ currPlayer.removeListener(this);
+ currPlayer.deactivate();
+ player=null;
}
}
=======================================
---
/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
Fri Jan 4 07:17:31 2013
+++
/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
Sat Jan 12 12:37:26 2013
@@ -335,7 +335,7 @@
dataChannel.disconnect();
}
catch (IOException e) {
- logger.error(e);
+ logger.error(e);
}
connectImmediately=udpManager.connectImmediately((InetSocketAddress)address);
@@ -343,8 +343,9 @@
try {
dataChannel.connect(address);
}
- catch (IOException e) {
- logger.error(e);
+ catch (IOException e) {
+ logger.info("Can not connect to remote address , please check
that you are not using local address - 127.0.0.X to connect to remote");
+ logger.error(e);
}
}
@@ -368,14 +369,14 @@
dataChannel.disconnect();
}
catch(IOException e) {
- logger.error(e);
+ logger.error(e);
}
try {
dataChannel.socket().close();
dataChannel.close();
} catch(IOException e) {
- logger.error(e);
+ logger.error(e);
}
if (controlChannel != null) {
@@ -557,7 +558,7 @@
}
}
catch (Exception e) {
- logger.error(e);
+ logger.error(e);
}
}
@@ -591,11 +592,11 @@
dataChannel.disconnect();
}
catch(IOException ex) {
- logger.error(ex);
+ logger.error(ex);
}
}
catch (IOException e) {
- logger.error(e);
+ logger.error(e);
}
while (currAddress != null) {
@@ -638,11 +639,11 @@
dataChannel.disconnect();
}
catch(IOException ex) {
- logger.error(ex);
+ logger.error(ex);
}
}
catch (Exception e) {
- logger.error(e);
+ logger.error(e);
}
rtpHandler.isReading = false;
@@ -708,11 +709,11 @@
dataChannel.disconnect();
}
catch(IOException ex) {
- logger.error(ex);
+ logger.error(ex);
}
}
catch (Exception e) {
- logger.error(e);
+ logger.error(e);
}
}
@@ -764,11 +765,11 @@
dataChannel.disconnect();
}
catch(IOException ex) {
- logger.error(ex);
+ logger.error(ex);
}
}
catch (Exception e) {
- logger.error(e);
+ logger.error(e);
}
}
}
=======================================
---
/resources/recorder/src/main/java/org/mobicents/media/server/impl/resource/audio/AudioRecorderImpl.java
Fri Jan 4 07:17:31 2013
+++
/resources/recorder/src/main/java/org/mobicents/media/server/impl/resource/audio/AudioRecorderImpl.java
Sat Jan 12 12:37:26 2013
@@ -252,9 +252,7 @@
}
}
else
- this.lastPacketData=scheduler.getClock().getTime();
-
-
+ this.lastPacketData=scheduler.getClock().getTime();
}
public void setRecordDir(String recordDir) {
=======================================
---
/scheduler/src/main/java/org/mobicents/media/server/scheduler/ConcurrentLinkedList.java
Sun Feb 26 13:04:30 2012
+++
/scheduler/src/main/java/org/mobicents/media/server/scheduler/ConcurrentLinkedList.java
Sat Jan 12 12:37:26 2013
@@ -30,6 +30,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.locks.LockSupport;
/**
*
* @author oifa yulian
@@ -145,6 +146,13 @@
releaseAccess();
return false;
}
+
+ if(notifierSize>0)
+ {
+ updateNotifier(value);
+ releaseAccess();
+ return true;
+ }
if(cacheSize==0)
//need new node
@@ -153,8 +161,8 @@
{
//obtain node from cache decrease cache size
tempNode=cacheHead.next;
- cacheHead.next=tempNode.next;
- cacheHead.next.previous=cacheHead;
+ tempNode.next.previous=cacheHead;
+ cacheHead.next=tempNode.next;
tempNode.element=value;
cacheSize--;
@@ -167,10 +175,7 @@
tempNode.next=tail;
tail.previous=tempNode;
size++;
-
- if(notifierSize>0)
- updateNotifier(value);
-
+
releaseAccess();
return true;
}
@@ -200,6 +205,13 @@
return false;
aquireAccess();
+
+ if(notifierSize>0)
+ {
+ updateNotifier(value);
+ releaseAccess();
+ return true;
+ }
if(cacheSize==0)
//need new node
@@ -208,8 +220,8 @@
{
//obtain node from cache decrease cache size
tempNode=cacheHead.next;
- cacheHead.next=tempNode.next;
- cacheHead.next.previous=cacheHead;
+ tempNode.next.previous=cacheHead;
+ cacheHead.next=tempNode.next;
tempNode.element=value;
cacheSize--;
@@ -223,9 +235,6 @@
tail.previous=tempNode;
size++;
- if(notifierSize>0)
- updateNotifier(value);
-
releaseAccess();
return true;
}
@@ -354,42 +363,29 @@
notifierTail.previous.next=tempNotifier;
tempNotifier.previous=notifierTail.previous;
- tempNotifier.next=notifierTail;
+ tempNotifier.next=notifierTail;
notifierTail.previous=tempNotifier;
notifierSize++;
+ tempNotifier.element=null;
+ tempNotifier.waitingThread=Thread.currentThread();
- while(size==0)
- {
- //release lock so others will be able to add
nodes and wait
- releaseAccess();
+ //release lock so others will be able to add nodes and
wait
+ releaseAccess();
+
+ while(tempNotifier.element==null)
+ LockSupport.park();
- synchronized(tempNotifier.lock)
- {
- try
- {
- tempNotifier.lock.wait();
- }
- catch(InterruptedException e)
- {
-
- }
- }
-
- aquireAccess();
-
- if(size!=0)
- {
- //take back notifier
-
tempNotifier.previous.next=tempNotifier.next;
-
tempNotifier.next.previous=tempNotifier.previous;
-
-
tempNotifier.next=notifierCacheHead.next;
-
notifierCacheHead.next.previous=tempNotifier;
- notifierCacheHead.next=tempNotifier;
- tempNotifier.previous=notifierCacheHead;
- cacheNotifierSize++;
- }
- }
+ aquireAccess();
+
+ tempNotifier.next=notifierCacheHead.next;
+ notifierCacheHead.next.previous=tempNotifier;
+ notifierCacheHead.next=tempNotifier;
+ tempNotifier.previous=notifierCacheHead;
+ cacheNotifierSize++;
+
+ E result=tempNotifier.element;
+ releaseAccess();
+ return result;
}
//disconnect from main list
@@ -439,57 +435,59 @@
tempNotifier.previous=notifierTail.previous;
tempNotifier.next=notifierTail;
- notifierTail.previous=tempNotifier;
+ notifierTail.previous=tempNotifier;
notifierSize++;
- while(size==0)
+ tempNotifier.element=null;
+ tempNotifier.waitingThread=Thread.currentThread();
+
+ //release lock so others will be able to add nodes and
wait
+ releaseAccess();
+
+ switch(unit)
{
- //release lock so others will be able to add
nodes and wait
- releaseAccess();
+ case SECONDS:
+ TimeUnit.SECONDS.toNanos(timeout);
+ break;
+ case MILLISECONDS:
+ TimeUnit.MILLISECONDS.toNanos(timeout);
+ break;
+ case MICROSECONDS:
+ TimeUnit.MICROSECONDS.toNanos(timeout);
+ break;
+ case NANOSECONDS:
+ LockSupport.parkNanos(timeout);
+ break;
+ }
- synchronized(tempNotifier.lock)
- {
- try {
- switch(unit)
- {
- case MICROSECONDS:
-
tempNotifier.lock.wait(timeout/1000L,(int)((timeout*1000L)%1000000L));
- break;
- case MILLISECONDS:
-
tempNotifier.lock.wait(timeout);
- break;
- case NANOSECONDS:
-
tempNotifier.lock.wait(timeout/1000000L,(int)(timeout%1000000L));
- break;
- case SECONDS:
-
tempNotifier.lock.wait(timeout*1000L);
- break;
- }
- }
- catch(InterruptedException e)
- {
-
- }
- }
+ aquireAccess();
- aquireAccess();
+ if(tempNotifier.element==null)
+ {
+ //take back notifier
+ tempNotifier.previous.next=tempNotifier.next;
+
tempNotifier.next.previous=tempNotifier.previous;
+
+ tempNotifier.next=notifierCacheHead.next;
+ notifierCacheHead.next.previous=tempNotifier;
+ notifierCacheHead.next=tempNotifier;
+ tempNotifier.previous=notifierCacheHead;
+ cacheNotifierSize++;
- if(size==0)
- {
- releaseAccess();
- throw new InterruptedException();
- }
+ releaseAccess();
+ throw new InterruptedException();
}
-
- //take back notifier
- tempNotifier.previous.next=tempNotifier.next;
- tempNotifier.next.previous=tempNotifier.previous;
tempNotifier.next=notifierCacheHead.next;
notifierCacheHead.next.previous=tempNotifier;
notifierCacheHead.next=tempNotifier;
tempNotifier.previous=notifierCacheHead;
cacheNotifierSize++;
+
+ E result=tempNotifier.element;
+ releaseAccess();
+
+ return result;
}
//disconnect from main list
@@ -715,15 +713,15 @@
private void updateNotifier(E newElement)
{
- if(notifierSize==0)
- return;
-
notifierSize--;
- Notifier tempNotifier=notifierHead.next;
- synchronized(tempNotifier.lock)
- {
- tempNotifier.lock.notify();
- }
+ Notifier tempNotifier=notifierHead.next;
+
+ //take back notifier
+ notifierHead.next=tempNotifier.next;
+ notifierHead.next.previous=notifierHead;
+
+ tempNotifier.element=newElement;
+ LockSupport.unpark(tempNotifier.waitingThread);
}
private void aquireAccess()
@@ -744,9 +742,10 @@
}
private class Notifier<E> {
- private Object lock=new Object();
Notifier next;
Notifier previous;
+ E element;
+ Thread waitingThread;
}
private class Node<E> {
=======================================
---
/scheduler/src/main/java/org/mobicents/media/server/scheduler/IntConcurrentLinkedList.java
Fri Feb 17 05:07:24 2012
+++
/scheduler/src/main/java/org/mobicents/media/server/scheduler/IntConcurrentLinkedList.java
Sat Jan 12 12:37:26 2013
@@ -49,8 +49,6 @@
private Integer size=0;
private Integer cacheSize=0;
- private ListIterator iterator=new ListIterator();
-
private Lock lock=new Lock();
public IntConcurrentLinkedList()
@@ -235,9 +233,15 @@
public Iterator<E> iterator()
{
+ ListIterator iterator=new ListIterator();
iterator.currNode=head;
return iterator;
}
+
+ public void resetIterator(Iterator<E> iterator)
+ {
+ ((ListIterator)iterator).currNode=head;
+ }
private void aquireAccess()
{
=======================================
---
/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
Sun Nov 25 14:18:52 2012
+++
/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
Sat Jan 12 12:37:26 2013
@@ -73,7 +73,7 @@
//priority queue
protected OrderedTaskQueue[] taskQueues = new OrderedTaskQueue[7];
- protected OrderedTaskQueue heartBeatQueue;
+ protected OrderedTaskQueue[] heartBeatQueue = new OrderedTaskQueue[5];
//CPU bound threads
private CoreThread coreThread;
@@ -96,7 +96,8 @@
for(int i=0;i<taskQueues.length;i++)
taskQueues[i]=new OrderedTaskQueue();
- heartBeatQueue=new OrderedTaskQueue();
+ for(int i=0;i<heartBeatQueue.length;i++)
+ heartBeatQueue[i]=new OrderedTaskQueue();
coreThread = new CoreThread(String.format("Scheduler"));
criticalThread = new CriticalThread(String.format("Scheduler"));
@@ -150,7 +151,7 @@
*/
public void submitHeatbeat(Task task) {
task.activate(true);
- heartBeatQueue.accept(task);
+ heartBeatQueue[coreThread.runIndex].accept(task);
}
/**
@@ -215,7 +216,8 @@
for(int i=0;i<taskQueues.length;i++)
taskQueues[i].clear();
- heartBeatQueue.clear();
+ for(int i=0;i<heartBeatQueue.length;i++)
+ heartBeatQueue[i].clear();
}
//removed statistics to increase perfomance
@@ -293,16 +295,15 @@
}
runIndex=(runIndex+1)%5;
- if(runIndex==0)
- synchronized(LOCK) {
- if(executeQueue(heartBeatQueue))
- try {
- LOCK.wait();
- }
- catch(InterruptedException e) {
- //lets continue
- }
- }
+ synchronized(LOCK) {
+
if(executeQueue(heartBeatQueue[runIndex]))
+ try {
+ LOCK.wait();
+ }
+ catch(InterruptedException e) {
+ //lets continue
+ }
+ }
synchronized(LOCK) {
if(executeQueue(taskQueues[MANAGEMENT_QUEUE]))
@@ -455,7 +456,7 @@
while(active)
{
waitingTasks.take().run();
- coreThread.notifyCompletion();
+ coreThread.notifyCompletion();
}
}