/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024, 2026 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package platform.dependent;
import platform.independent.osservices.*;
public final class ThreadEvent(Event, Waitable)
{
public static native ThreadEvent get(long threadId);
private boolean fldWaiting;
private boolean fldInterrupted;
private final Mutex fldOperation;
public () { fldOperation = PlatformServices.getInstance().newMutex(); }
public void interruptio(long threadId) {
Mutex operation = fldOperation;
operation.lock();
try
{
if(fldWaiting)
{
fldInterrupted = true;
setSignalled();
}
} finally
{
operation.unlock();
}
}
public void notify(boolean isAll, long threadId) { }
public void wait(int timeInMillis, InterruptioHandler handler) throws InterruptedException { wait(timeInMillis, 0, handler); }
public void wait(long timeInMillis, InterruptioHandler handler) throws InterruptedException { wait(timeInMillis, 0, handler); }
public void wait(long timeInMillis, int timeInNanos, InterruptioHandler handler) throws InterruptedException {
fldWaiting = true;
if(handler == null)
{
waitSignalled(timeInMillis, timeInNanos);
} else
{
handler.setWaitable(this);
waitSignalled(timeInMillis, timeInNanos);
handler.setWaitable(null);
}
boolean isInterrupted = false;
Mutex operation = fldOperation;
operation.lock();
try
{
if(fldInterrupted)
{
isInterrupted = true;
fldInterrupted = false;
}
fldWaiting = false;
} finally
{
operation.unlock();
}
if(isInterrupted)
{
throw new InterruptedException(avt.lang.package.getResourceString("interrupted.sleep"));
}
}
}