PRUDPPacketHandlerFactoryImplpublic class PRUDPPacketHandlerFactoryImpl extends Object
Fields Summary |
---|
private static Map | receiver_map | private static org.gudy.azureus2.core3.util.AEMonitor | class_mon | private static Map | releasable_map | private static Set | non_releasable_set |
Methods Summary |
---|
public static com.aelitis.net.udp.uc.PRUDPPacketHandler | getHandler(int port, java.net.InetAddress bind_ip, com.aelitis.net.udp.uc.PRUDPRequestHandler request_handler)
final Integer f_port = new Integer( port );
try{
class_mon.enter();
non_releasable_set.add( f_port );
PRUDPPacketHandlerImpl receiver = (PRUDPPacketHandlerImpl)receiver_map.get( f_port );
if ( receiver == null ){
receiver = new PRUDPPacketHandlerImpl( port, bind_ip );
receiver_map.put( f_port, receiver );
}
// only set the incoming request handler if one has been specified. This is important when
// the port is shared (e.g. default udp tracker and dht) and only one usage has need to handle
// unsolicited inbound requests as we don't want the tracker null handler to erase the dht's
// one
if ( request_handler != null ){
receiver.setRequestHandler( request_handler );
}
return( receiver );
}finally{
class_mon.exit();
}
| public static com.aelitis.net.udp.uc.PRUDPReleasablePacketHandler | getReleasableHandler(int port, com.aelitis.net.udp.uc.PRUDPRequestHandler request_handler)
final Integer f_port = new Integer( port );
try{
class_mon.enter();
PRUDPPacketHandlerImpl receiver = (PRUDPPacketHandlerImpl)receiver_map.get( f_port );
if ( receiver == null ){
receiver = new PRUDPPacketHandlerImpl( port, null );
receiver_map.put( f_port, receiver );
}
// only set the incoming request handler if one has been specified. This is important when
// the port is shared (e.g. default udp tracker and dht) and only one usage has need to handle
// unsolicited inbound requests as we don't want the tracker null handler to erase the dht's
// one
if ( request_handler != null ){
receiver.setRequestHandler( request_handler );
}
final PRUDPPacketHandlerImpl f_receiver = receiver;
final PRUDPReleasablePacketHandler rel =
new PRUDPReleasablePacketHandler()
{
public PRUDPPacketHandler
getHandler()
{
return( f_receiver );
}
public void
release()
{
try{
class_mon.enter();
List l = (List)releasable_map.get( f_port );
if ( l == null ){
Debug.out( "hmm" );
}else{
if ( !l.remove( this )){
Debug.out( "hmm" );
}else{
if ( l.size() == 0 ){
if ( !non_releasable_set.contains( f_port )){
f_receiver.destroy();
receiver_map.remove( f_port );
}
releasable_map.remove( f_port );
}
}
}
}finally{
class_mon.exit();
}
}
};
List l = (List)releasable_map.get( f_port );
if ( l == null ){
l = new ArrayList();
releasable_map.put( f_port, l );
}
l.add( rel );
if ( l.size() > 1024 ){
Debug.out( "things going wrong here" );
}
return( rel );
}finally{
class_mon.exit();
}
|
|