📄 listenermanager.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: ListenerManager.java
package org.gudy.azureus2.core3.util;
import java.lang.reflect.Method;
import java.util.*;
import org.gudy.azureus2.core3.logging.*;
// Referenced classes of package org.gudy.azureus2.core3.util:
// AESemaphore, AEThread2, Debug, ListenerManagerDispatcher,
// ListenerManagerDispatcherWithException, SystemTime
public class ListenerManager
{
private static final boolean TIME_LISTENERS = false;
protected String name;
protected ListenerManagerDispatcher target;
protected ListenerManagerDispatcherWithException target_with_exception;
protected boolean async;
protected AEThread2 async_thread;
protected List listeners;
protected List dispatch_queue;
protected AESemaphore dispatch_sem;
public static ListenerManager createManager(String name, ListenerManagerDispatcher target)
{
return new ListenerManager(name, target, false);
}
public static ListenerManager createAsyncManager(String name, ListenerManagerDispatcher target)
{
return new ListenerManager(name, target, true);
}
protected ListenerManager(String _name, ListenerManagerDispatcher _target, boolean _async)
{
listeners = new ArrayList();
name = _name;
target = _target;
async = _async;
if (target instanceof ListenerManagerDispatcherWithException)
target_with_exception = (ListenerManagerDispatcherWithException)target;
if (async)
{
dispatch_sem = new AESemaphore((new StringBuilder()).append("ListenerManager::").append(name).toString());
dispatch_queue = new LinkedList();
if (target_with_exception != null)
throw new RuntimeException("Can't have an async manager with exceptions!");
}
}
public void addListener(Object listener)
{
synchronized (this)
{
ArrayList new_listeners = new ArrayList(listeners);
if (new_listeners.contains(listener))
Logger.log(new LogEvent(LogIDs.CORE, 1, (new StringBuilder()).append("addListener called but listener already added for ").append(name).append("\n\t").append(Debug.getStackTrace(true, false)).toString()));
new_listeners.add(listener);
if (new_listeners.size() > 50)
Logger.log(new LogEvent(LogIDs.CORE, 1, (new StringBuilder()).append("addListener: over 50 listeners added for ").append(name).append("\n\t").append(Debug.getStackTrace(true, false)).toString()));
listeners = new_listeners;
if (async && async_thread == null)
{
async_thread = new AEThread2(name, true) {
final ListenerManager this$0;
public void run()
{
dispatchLoop();
}
{
this$0 = ListenerManager.this;
super(x0, x1);
}
};
async_thread.start();
}
}
}
public void removeListener(Object listener)
{
synchronized (this)
{
ArrayList new_listeners = new ArrayList(listeners);
new_listeners.remove(listener);
listeners = new_listeners;
if (async && listeners.size() == 0)
{
async_thread = null;
dispatch_sem.release();
}
}
}
public boolean hasListener(Object listener)
{
ListenerManager listenermanager = this;
JVM INSTR monitorenter ;
return listeners.contains(listener);
Exception exception;
exception;
throw exception;
}
public void clear()
{
synchronized (this)
{
listeners = new ArrayList();
if (async)
{
async_thread = null;
dispatch_sem.release();
}
}
}
public List getListenersCopy()
{
return listeners;
}
public void dispatch(int type, Object value)
{
dispatch(type, value, false);
}
public void dispatch(int type, Object value, boolean blocking)
{
AESemaphore sem;
label0:
{
if (!async)
break MISSING_BLOCK_LABEL_121;
sem = null;
if (blocking)
sem = new AESemaphore("ListenerManager:blocker");
synchronized (this)
{
if (listeners.size() != 0)
break label0;
}
return;
}
dispatch_queue.add(((Object) (new Object[] {
listeners, new Integer(type), value, sem
})));
listenermanager;
JVM INSTR monitorexit ;
goto _L1
exception;
throw exception;
_L1:
dispatch_sem.release();
if (sem != null)
sem.reserve();
break MISSING_BLOCK_LABEL_181;
if (target_with_exception != null)
throw new RuntimeException("call dispatchWithException, not dispatch");
List listeners_ref;
synchronized (this)
{
listeners_ref = listeners;
}
try
{
dispatchInternal(listeners_ref, type, value);
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
public void dispatchWithException(int type, Object value)
throws Throwable
{
List listeners_ref;
synchronized (this)
{
listeners_ref = listeners;
}
dispatchInternal(listeners_ref, type, value);
}
public void dispatch(Object listener, int type, Object value)
{
dispatch(listener, type, value, false);
}
public void dispatch(Object listener, int type, Object value, boolean blocking)
{
if (async)
{
AESemaphore sem = null;
if (blocking)
sem = new AESemaphore("ListenerManager:blocker");
synchronized (this)
{
dispatch_queue.add(((Object) (new Object[] {
listener, new Integer(type), value, sem, null
})));
if (async_thread == null)
{
async_thread = new AEThread2(name, true) {
final ListenerManager this$0;
public void run()
{
dispatchLoop();
}
{
this$0 = ListenerManager.this;
super(x0, x1);
}
};
async_thread.start();
}
}
dispatch_sem.release();
if (sem != null)
sem.reserve();
} else
{
if (target_with_exception != null)
throw new RuntimeException("call dispatchWithException, not dispatch");
doDispatch(listener, type, value);
}
}
protected String getListenerName(Object listener)
{
Class listener_class = listener.getClass();
String res = listener_class.getName();
try
{
Method getString = listener_class.getMethod("getString", new Class[0]);
if (getString != null)
{
String s = (String)getString.invoke(listener, new Object[0]);
res = (new StringBuilder()).append(res).append(" (").append(s).append(")").toString();
}
}
catch (Throwable e) { }
return res;
}
protected void doDispatch(Object listener, int type, Object value)
{
try
{
target.dispatch(listener, type, value);
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
protected void doDispatchWithException(Object listener, int type, Object value)
throws Throwable
{
target_with_exception.dispatchWithException(listener, type, value);
}
protected void dispatchInternal(List listeners_ref, int type, Object value)
throws Throwable
{
for (int i = 0; i < listeners_ref.size(); i++)
if (target_with_exception != null)
doDispatchWithException(listeners_ref.get(i), type, value);
else
doDispatch(listeners_ref.get(i), type, value);
}
protected void dispatchInternal(Object listener, int type, Object value)
throws Throwable
{
if (target_with_exception != null)
doDispatchWithException(listener, type, value);
else
doDispatch(listener, type, value);
}
public void dispatchLoop()
{
_L3:
Object data[];
label0:
{
dispatch_sem.reserve();
data = null;
synchronized (this)
{
if (async_thread != null && async_thread.isCurrentThread())
break label0;
dispatch_sem.release();
}
break; /* Loop/switch isn't completed */
}
if (dispatch_queue.size() > 0)
data = (Object[])(Object[])dispatch_queue.remove(0);
listenermanager;
JVM INSTR monitorexit ;
goto _L1
exception;
throw exception;
_L1:
if (data == null)
continue; /* Loop/switch isn't completed */
if (data.length == 4)
dispatchInternal((List)data[0], ((Integer)data[1]).intValue(), data[2]);
else
dispatchInternal(data[0], ((Integer)data[1]).intValue(), data[2]);
if (data[3] != null)
((AESemaphore)data[3]).release();
continue; /* Loop/switch isn't completed */
Throwable e;
e;
Debug.printStackTrace(e);
if (data[3] != null)
((AESemaphore)data[3]).release();
if (true) goto _L3; else goto _L2
Exception exception1;
exception1;
if (data[3] != null)
((AESemaphore)data[3]).release();
throw exception1;
_L2:
}
public static void dispatchWithTimeout(List _listeners, ListenerManagerDispatcher _dispatcher, long _timeout)
{
List listeners = new ArrayList(_listeners);
boolean completed[] = new boolean[listeners.size()];
AESemaphore timeout_sem = new AESemaphore("ListenerManager:dwt:timeout");
for (int i = 0; i < listeners.size(); i++)
{
int f_i = i;
(new AEThread2("ListenerManager:dwt:dispatcher", true, _dispatcher, listeners, f_i, completed, timeout_sem) {
final ListenerManagerDispatcher val$_dispatcher;
final List val$listeners;
final int val$f_i;
final boolean val$completed[];
final AESemaphore val$timeout_sem;
public void run()
{
_dispatcher.dispatch(listeners.get(f_i), -1, null);
completed[f_i] = true;
timeout_sem.release();
break MISSING_BLOCK_LABEL_87;
Throwable e;
e;
Debug.printStackTrace(e);
completed[f_i] = true;
timeout_sem.release();
break MISSING_BLOCK_LABEL_87;
Exception exception;
exception;
completed[f_i] = true;
timeout_sem.release();
throw exception;
}
{
_dispatcher = listenermanagerdispatcher;
listeners = list;
f_i = i;
completed = aflag;
timeout_sem = aesemaphore;
super(x0, x1);
}
}).start();
}
boolean timeout_occurred = false;
for (int i = 0; i < listeners.size(); i++)
{
if (_timeout <= 0L)
{
timeout_occurred = true;
break;
}
long start = SystemTime.getCurrentTime();
if (!timeout_sem.reserve(_timeout))
{
timeout_occurred = true;
break;
}
long end = SystemTime.getCurrentTime();
if (end > start)
_timeout -= end - start;
}
if (timeout_occurred)
{
String str = "";
for (int i = 0; i < completed.length; i++)
if (!completed[i])
str = (new StringBuilder()).append(str).append(str.length() != 0 ? "," : "").append(listeners.get(i)).toString();
if (str.length() > 0)
Debug.out((new StringBuilder()).append("Listener dispatch timeout: failed = ").append(str).toString());
}
}
public long size()
{
if (listeners == null)
return 0L;
else
return (long)listeners.size();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -