EventSetThreadEntry.avt

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

/*
    Исходный код среды исполнения ПВТ-ОО.

    Этот исходный код является частью проекта ПВТ-ОО.

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

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

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

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

package platform.dependent;

package class EventSetThreadEntry(ThreadEntry, Closeable)
{
    private static long internalCounter = 0x00007fffffffffffL;

    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 static native long getInternalCounterValue();


    private int fldState;
    private long fldEvent;

    public (int state): this(getCurrentThreadId(), state) {  }

    public (long threadId, int state): super(threadId) {
        char[] name = new char[128];
        int index = writeStringToCharArray("Событие", name, 0);
        index = writeLongToCharArray(Kernel32.getCurrentProcessId(), name, index);
        index = writeLongToCharArray(Kernel32.getCurrentThreadId(), name, index);
        index = writeLongToCharArray(TimeServices.currentTimeInMillis(), name, index);
        index = writeLongToCharArray(System.identityHashCode(this) >> 8, name, index);
        writeLongToCharArray(getInternalCounterValue(), name, index);
        fldState = state;
        fldEvent = Kernel32.createEvent(Kernel32.NULL, false, false, name.getPointer());
    }

    public void close() {
        long event = fldEvent;
        if(event != Kernel32.NULL)
        {
            fldEvent = Kernel32.NULL;
            Kernel32.closeHandle(event);
        }
    }

    public final void setSignalled() { Kernel32.setEvent(fldEvent); }

    public final void waitSignalled(int timeInMillis) { Kernel32.waitForSingleObject(fldEvent, timeInMillis <= 0 ? Kernel32.INFINITE : timeInMillis); }

    public final int state { read = fldState, write = fldState }
}