📄 azureuscoreimpl.java
字号:
throws AzureusCoreException
{
if ( !Thread.currentThread().isDaemon()){
r.run();
}else{
final AESemaphore sem = new AESemaphore( "AzureusCore:runNonDaemon" );
final Throwable[] error = {null};
new AEThread( "AzureusCore:runNonDaemon" )
{
public void
runSupport()
{
try{
r.run();
}catch( Throwable e ){
error[0] = e;
}finally{
sem.release();
}
}
}.start();
sem.reserve();
if ( error[0] != null ){
if ( error[0] instanceof AzureusCoreException ){
throw((AzureusCoreException)error[0]);
}else{
throw( new AzureusCoreException( "Operation failed", error[0] ));
}
}
}
}
public void
stop()
throws AzureusCoreException
{
runNonDaemon(new AERunnable() {
public void runSupport() {
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "Stop operation starts"));
stopSupport(true);
}
});
}
private void
stopSupport(
boolean apply_updates )
throws AzureusCoreException
{
try{
this_mon.enter();
if ( stopped ){
// ensure config is saved as there may be pending changes to persist and we've got here
// via a shutdown hook
COConfigurationManager.save();
Logger.log(new LogEvent(LOGID, "Waiting for stop to complete"));
stopping_sem.reserve();
return;
}
stopped = true;
if ( !started ){
Logger.log(new LogEvent(LOGID, "Core not started"));
// might have been marked dirty due to core being created to allow functions to be used but never started...
if ( AEDiagnostics.isDirty()){
AEDiagnostics.markClean();
}
stopping_sem.releaseForever();
return;
}
}finally{
this_mon.exit();
}
List sync_listeners = new ArrayList();
List async_listeners = new ArrayList();
for (int i=0;i<lifecycle_listeners.size();i++){
AzureusCoreLifecycleListener l = (AzureusCoreLifecycleListener)lifecycle_listeners.get(i);
if ( l.syncInvokeRequired()){
sync_listeners.add( l );
}else{
async_listeners.add( l );
}
}
try{
for (int i=0;i<sync_listeners.size();i++){
try{
((AzureusCoreLifecycleListener)sync_listeners.get(i)).stopping( this );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
// in case something hangs during listener notification (e.g. version check server is down
// and the instance manager tries to obtain external address) we limit overall dispatch
// time to 10 seconds
ListenerManager.dispatchWithTimeout(
async_listeners,
new ListenerManagerDispatcher()
{
public void
dispatch(
Object listener,
int type,
Object value )
{
((AzureusCoreLifecycleListener)listener).stopping( AzureusCoreImpl.this );
}
},
10*1000 );
global_manager.stopGlobalManager();
for (int i=0;i<sync_listeners.size();i++){
try{
((AzureusCoreLifecycleListener)sync_listeners.get(i)).stopped( this );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
ListenerManager.dispatchWithTimeout(
async_listeners,
new ListenerManagerDispatcher()
{
public void
dispatch(
Object listener,
int type,
Object value )
{
((AzureusCoreLifecycleListener)listener).stopped( AzureusCoreImpl.this );
}
},
10*1000 );
NonDaemonTaskRunner.waitUntilIdle();
// shut down diags - this marks the shutdown as tidy and saves the config
AEDiagnostics.markClean();
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "Stop operation completes"));
// if any installers exist then we need to closedown via the updater
if ( apply_updates &&
getPluginManager().getDefaultPluginInterface().getUpdateManager().getInstallers().length > 0 ){
AzureusRestarterFactory.create( this ).restart( true );
}
try{
ThreadGroup tg = Thread.currentThread().getThreadGroup();
Thread[] threads = new Thread[tg.activeCount()+32];
tg.enumerate( threads );
for (int i=0;i<threads.length;i++){
final Thread t = threads[i];
if ( t != null && t != Thread.currentThread() && !t.isDaemon() && !AEThread.isOurThread( t )){
new AEThread( "VMKiller", true )
{
public void
runSupport()
{
try{
Thread.sleep(10*1000);
Debug.out( "Non-daemon thread found '" + t.getName() + "', force closing VM" );
SESecurityManager.exitVM(0);
}catch( Throwable e ){
}
}
}.start();
break;
}
}
}catch( Throwable e ){
}
}finally{
stopping_sem.releaseForever();
}
}
public void
requestStop()
throws AzureusCoreException
{
if (stopped)
return;
runNonDaemon(new AERunnable() {
public void runSupport() {
for (int i = 0; i < lifecycle_listeners.size(); i++) {
if (!((AzureusCoreLifecycleListener) lifecycle_listeners.get(i))
.stopRequested(AzureusCoreImpl.this)) {
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING,
"Request to stop the core has been denied"));
return;
}
}
stop();
}
});
}
public void
restart()
throws AzureusCoreException
{
runNonDaemon(new AERunnable() {
public void runSupport() {
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "Restart operation starts"));
checkRestartSupported();
stopSupport(false);
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "Restart operation: stop complete,"
+ "restart initiated"));
AzureusRestarterFactory.create(AzureusCoreImpl.this).restart(false);
}
});
}
public void
requestRestart()
throws AzureusCoreException
{
runNonDaemon(new AERunnable() {
public void runSupport() {
checkRestartSupported();
for (int i = 0; i < lifecycle_listeners.size(); i++) {
AzureusCoreLifecycleListener l = (AzureusCoreLifecycleListener) lifecycle_listeners
.get(i);
if (!l.restartRequested(AzureusCoreImpl.this)) {
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING,
"Request to restart the core"
+ " has been denied"));
return;
}
}
restart();
}
});
}
public void
checkRestartSupported()
throws AzureusCoreException
{
if ( getPluginManager().getPluginInterfaceByClass( "org.gudy.azureus2.update.UpdaterPatcher") == null ){
Logger.log(new LogAlert(LogAlert.REPEATABLE, LogAlert.AT_ERROR,
"Can't restart without the 'azupdater' plugin installed"));
throw( new AzureusCoreException("Can't restart without the 'azupdater' plugin installed"));
}
}
public GlobalManager
getGlobalManager()
throws AzureusCoreException
{
if ( global_manager == null ){
throw( new AzureusCoreException( "Core not running" ));
}
return( global_manager );
}
public TRHost
getTrackerHost()
throws AzureusCoreException
{
return( TRHostFactory.getSingleton());
}
public PluginManagerDefaults
getPluginManagerDefaults()
throws AzureusCoreException
{
return( PluginManager.getDefaults());
}
public PluginManager
getPluginManager()
throws AzureusCoreException
{
// don't test for runnign here, the restart process calls this after terminating the core...
return( PluginInitializer.getDefaultInterface().getPluginManager());
}
public IpFilterManager
getIpFilterManager()
throws AzureusCoreException
{
return( IpFilterManagerFactory.getSingleton());
}
public AZInstanceManager
getInstanceManager()
{
return( instance_manager );
}
public SpeedManager
getSpeedManager()
{
return( speed_manager );
}
public CryptoManager
getCryptoManager()
{
return( crypto_manager );
}
public NATTraverser
getNATTraverser()
{
return( nat_traverser );
}
public AzureusCoreOperation
createOperation(
final int type )
{
AzureusCoreOperation op =
new AzureusCoreOperation()
{
public int
getOperationType()
{
return( type );
}
public AzureusCoreOperationTask
getTask()
{
return null;
}
public void
reportCurrentTask(
String task )
{
AzureusCoreImpl.this.reportCurrentTask( this, task );
}
public void
reportPercent(
int percent )
{
AzureusCoreImpl.this.reportPercent( this, percent );
}
};
for (int i=0;i<operation_listeners.size();i++){
try{
((AzureusCoreOperationListener)operation_listeners.get(i)).operationCreated( op );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
return( op );
}
public void
createOperation(
final int type,
AzureusCoreOperationTask task )
{
final AzureusCoreOperationTask[] f_task = { task };
AzureusCoreOperation op =
new AzureusCoreOperation()
{
public int
getOperationType()
{
return( type );
}
public AzureusCoreOperationTask
getTask()
{
return( f_task[0] );
}
public void
reportCurrentTask(
String task )
{
AzureusCoreImpl.this.reportCurrentTask( this, task );
}
public void
reportPercent(
int percent )
{
AzureusCoreImpl.this.reportPercent( this, percent );
}
};
for (int i=0;i<operation_listeners.size();i++){
// don't catch exceptions here as we want errors from task execution to propagate
// back to the invoker
if (((AzureusCoreOperationListener)operation_listeners.get(i)).operationCreated( op )){
f_task[0] = null;
}
}
// nobody volunteeered to run it for us, we'd better do it
if ( f_task[0] != null ){
task.run( op );
}
}
protected void
reportCurrentTask(
AzureusCoreOperation op,
String currentTask )
{
if ( op.getOperationType() == AzureusCoreOperation.OP_INITIALISATION ){
PluginInitializer.fireEvent( PluginEvent.PEV_INITIALISATION_PROGRESS_TASK, currentTask );
}
for (int i=0;i<listeners.size();i++){
try{
((AzureusCoreListener)listeners.get(i)).reportCurrentTask( op, currentTask );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected void
reportPercent(
AzureusCoreOperation op,
int percent )
{
if ( op.getOperationType() == AzureusCoreOperation.OP_INITIALISATION ){
PluginInitializer.fireEvent( PluginEvent.PEV_INITIALISATION_PROGRESS_PERCENT, new Integer( percent ));
}
for (int i=0;i<listeners.size();i++){
try{
((AzureusCoreListener)listeners.get(i)).reportPercent( op, percent );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
public void
addLifecycleListener(
AzureusCoreLifecycleListener l )
{
lifecycle_listeners.add(l);
}
public void
removeLifecycleListener(
AzureusCoreLifecycleListener l )
{
lifecycle_listeners.remove(l);
}
public void
addListener(
AzureusCoreListener l )
{
listeners.add( l );
}
public void
removeListener(
AzureusCoreListener l )
{
listeners.remove( l );
}
public void
addOperationListener(
AzureusCoreOperationListener l )
{
operation_listeners.add(l);
}
public void
removeOperationListener(
AzureusCoreOperationListener l )
{
operation_listeners.remove(l);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -