Event.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Реализация среды исполнения языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024, 2026 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package platform.independent.osservices;

import platform.dependent.*;

public class Event(Object)
{
    private static long counter = 0x7fffffL;

    private static native long interlockedIncrement();

    private static int writeStringToCharArray(String value, char[] array, int index) {
        int length = value.length;
        value.getChars(0, length, array, index);
        return index + length;
    }

    private static int writeLongToCharArray(long value, char[] array, int index) {
        for(array[index++] = '.', int bits = 60; bits >= 0; bits -= 5) array[index++] = Char.toChar((int) (value >> bits) & 0x1f);
        return index;
    }

    private final boolean fldManualReset;
    private final long fldDescriptor;

    public (): this(false, false) {  }

    public (boolean manualReset): this(manualReset, false) {  }

    public (boolean manualReset, boolean initialState) {
        char[] name = new char[0x50];
        int index = writeStringToCharArray("Event", name, 0);
        PlatformServices services = PlatformServices.getInstance();
        index = writeLongToCharArray(services.getCurrentProcessId(), name, index);
        index = writeLongToCharArray(services.getCurrentThreadId()[0], name, index);
        index = writeLongToCharArray(services.currentTimeInMillis(), name, index);
        index = writeLongToCharArray(System.identityHashCode(this), name, index);
        writeLongToCharArray(interlockedIncrement(), name, index);
        fldManualReset = manualReset;
        fldDescriptor = services.createEvent(manualReset, initialState, name);
    }

    public void setSignalled() { PlatformServices.getInstance().setSignalledEvent(fldDescriptor); }

    public void clearSignalled() { PlatformServices.getInstance().clearSignalledEvent(fldDescriptor); }

    public void waitSignalled(long timeInMillis, int timeInNanos) {
        if(timeInMillis < 0)
        {
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument.negative"), new Object[] { "timeInMillis" }));
        }
        if(timeInNanos < 0 || timeInNanos > 999999)
        {
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument.out-of-range"), new Object[] { "timeInNanos" }));
        }
        PlatformServices.getInstance().waitSignalledEvent(fldDescriptor, timeInMillis, timeInNanos);
    }

    public final void waitSignalled(long timeInMillis) { waitSignalled(timeInMillis, 0); }

    public final void waitSignalled() { waitSignalled(0, 0); }

    public boolean manualReset { read = fldManualReset }

    protected void beforeDestruction() { PlatformServices.getInstance().destroyEvent(fldDescriptor); }
}