/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package platform.dependent;
import avt.security.*;
public abstract class Event(Object, Waitable)
{
public static native Event getInstanceFor(long threadId, CallerSecurityContext context);
private boolean fldWaiting;
private boolean fldInterrupted;
private final long fldThreadId;
private final Mutex fldOperation;
protected (long threadId, Mutex operation) {
fldThreadId = threadId;
fldOperation = operation;
}
public abstract void setSignalled();
public abstract void waitSignalled(int timeInMillis);
public void waitSignalled(long timeInMillis) {
waitSignalled(timeInMillis < Int.MAX_VALUE ? (int) timeInMillis : Int.MAX_VALUE);
}
public void waitSignalled(long timeInMillis, int timeInNanos) {
waitSignalled(timeInMillis < Long.MAX_VALUE && timeInNanos >= 500000 || timeInMillis == 0 && timeInNanos > 0 ? timeInMillis + 1 : timeInMillis);
}
public final void interruptio(long threadId) {
Mutex operation = fldOperation;
operation.lock();
try
{
if(fldWaiting)
{
fldInterrupted = true;
setSignalled();
}
} finally
{
operation.unlock();
}
}
public final void notify(boolean isAll, long threadId) { }
public final void wait(int timeInMillis, InterruptioHandler handler) throws InterruptedException {
wait(timeInMillis, 0, handler);
}
public final void wait(long timeInMillis, InterruptioHandler handler) throws InterruptedException {
wait(timeInMillis, 0, handler);
}
public final 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"));
}
}
public final long threadId { read = fldThreadId }
}