/*
Реализация спецификаций CLDC версии 1.1 (JSR-139), MIDP версии 2.1 (JSR-118)
и других спецификаций для функционирования компактных приложений на языке
Java (мидлетов) в среде программного обеспечения Малик Эмулятор.
Copyright © 2016–2017, 2019–2023 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package malik.emulator.util;
public class ThreadTerminationListenerCollection extends Object
{
public static final ThreadTerminationListenerCollection instance;
static {
instance = new ThreadTerminationListenerCollection();
}
private ThreadTerminationListener[] listeners;
private final Object monitor;
public ThreadTerminationListenerCollection() {
this.listeners = new ThreadTerminationListener[3];
this.monitor = new Object();
}
public void addListener(ThreadTerminationListener listener) {
if(listener == null) return;
synchronized(monitor)
{
int len;
ThreadTerminationListener[] listeners;
if(Array.findf(listeners = this.listeners, 0, listener) >= (len = listeners.length))
{
int index;
if((index = Array.findf(listeners, 0, null)) >= len)
{
Array.copy(listeners, 0, listeners = new ThreadTerminationListener[(len << 1) + 1], 0, len);
this.listeners = listeners;
}
listeners[index] = listener;
}
}
}
public void removeListener(ThreadTerminationListener listener) {
synchronized(monitor)
{
int index;
ThreadTerminationListener[] listeners;
if((index = Array.findf(listeners = this.listeners, 0, listener)) < listeners.length) listeners[index] = null;
}
}
public void notifyListeners(Thread terminatedThread, Throwable exitThrowable) {
ThreadTerminationListener[] listeners;
for(int len = (listeners = this.listeners).length, i = 0; i < len; i++)
{
ThreadTerminationListener listener;
if((listener = listeners[i]) != null)
{
try
{
listener.threadTerminated(terminatedThread, exitThrowable);
}
catch(Throwable e)
{
}
}
}
}
}