Runtime.avt

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

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

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

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

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

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

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

package avt.lang;

import platform.dependent.*;
import platform.independent.filesystem.*;

public abstract class Runtime(Object)
{
    private static Runtime instance;

    public static Runtime getInstance() { return instance; }

    /*<fold Runtime main constructor invocation>*/
        protected static native void invokeMainConstructor(Runtime instance);
    /*</fold>*/

    /*<fold routines of the collectGarbage method>*/
        protected static void invokeBeforeDestruction(long pointer) {
            try
            {
                Object instance = toInstance(pointer);
                if(!instance.getClass().isArray()) instance.beforeDestruction();
            } catch(Throwable e) {  }
        }

        protected static native void releaseRefsInInstance(long pointer);

        protected static native long refsFromInstance(long pointer, long target);

        protected static native long2 refsToInstance(long pointer);
    /*</fold>*/

    /*<fold routines of the allocateInstance method>*/
        protected static native Object initializeInstance(long pointer, Class type, long size, int length);
    /*</fold>*/

    /*<fold routines of the intern method>*/
        protected static native Class getInstanceClass(long pointer);

        protected static native Object toInstance(long pointer);
    /*</fold>*/

    /*<fold routines of the isProtectedMemory method>*/
        protected static boolean isIntersectRegion(long beginPointer1, long endPointer1, long beginPointer2, long endPointer2) {
            long beginPointer3 = beginPointer1 >= beginPointer2 ? beginPointer1 : beginPointer2;
            long endPointer3 = endPointer1 < endPointer2 ? endPointer1 : endPointer2;
            return beginPointer3 < endPointer3;
        }

        protected static native boolean isIntersectRegion(Object instance, long instanceSize, long beginPointer, long endPointer);
    /*</fold>*/

    package static void invokeAfterConstruction(Object instance) { instance.afterConstruction(); }

    private static native int getProcessorBrandString(byte[] dst);

    private static native long2 getProgrammeCodeRegion();

    private static native long2 getProgrammeDataRegion();


    private boolean fldMultiThreaded;
    private long fldCollectedBytes;
    private final Mutex fldSystemMutex;
    private final String fldProcessorBrandString;
    private final Object fldGarbageCollectorMonitor;

    protected () {
        if(instance != null)
        {
            throw new SecurityException("создание ещё одной среды исполнения невозможно");
        }
        instance = this;
        byte[] processorBrandStringBytes = new byte[48];
        int processorBrandStringLength = getProcessorBrandString(processorBrandStringBytes);
        char[] processorBrandStringChars = new char[processorBrandStringLength];
        for(int i = processorBrandStringLength; i-- > 0; ) processorBrandStringChars[i] = (char) (processorBrandStringBytes[i] & 0xffi);
        fldSystemMutex = new Mutex();
        fldProcessorBrandString = new String(processorBrandStringChars, 0, processorBrandStringLength);
        fldGarbageCollectorMonitor = new Object();
    }

    public abstract long freeMemory();

    public abstract long totalMemory();

    public void exit(int statusCode) { throw new SecurityException("выход с помощью Runtime.exit не поддерживается"); }

    public final void gc() { synchronized with(fldGarbageCollectorMonitor) { notify(); } }

    public final long collectedBytes() { return fldCollectedBytes; }

    protected abstract void collectGarbage();

    protected abstract Object allocateInstance(Class type, long size, int length, boolean executable);

    protected abstract String intern(String string);

    protected void nowMultiThreaded() {  }

    protected boolean isProtectedMemory(long beginPointer, long endPointer) {
        long2 codeRegion = getProgrammeCodeRegion();
        long2 dataRegion = getProgrammeDataRegion();
        return isIntersectRegion(beginPointer, endPointer, codeRegion[0], codeRegion[1]) || isIntersectRegion(beginPointer, endPointer, dataRegion[0], dataRegion[1]);
    }

    protected final void afterConstruction() {
        Thread.initialize();
        with((Thread) (new GarbageCollectorThread(fldGarbageCollectorMonitor)))
        {
            priority = MIN_PRIORITY;
            start();
        }
    }

    protected final void beforeDestruction() {  }

    protected final void modCollectedBytes(long delta) { fldCollectedBytes += delta; }

    protected abstract String operatingSystemName { read }

    protected abstract String operatingSystemVersion { read }

    protected abstract FileSystem localFileSystem { read }

    protected int processorCodeBits { read = 64 }

    protected int processorNumberOfCores { read = 1 }

    protected String lineSeparator { read = "\n" }

    protected final boolean multiThreaded { read = fldMultiThreaded }

    protected final String processorBrandString { read = fldProcessorBrandString }

    package final void setMultiThreaded() {
        if(!fldMultiThreaded)
        {
            fldMultiThreaded = true;
            nowMultiThreaded();
        }
    }

    package final Mutex systemMutex { read = fldSystemMutex }
}

final class GarbageCollectorThread(Thread)
{
    private boolean fldLaunched;
    private final Object fldGarbageCollectorMonitor;

    public (Object garbageCollectorMonitor) { fldGarbageCollectorMonitor = garbageCollectorMonitor; }

    public void run() {
        if(!fldLaunched)
        {
            fldLaunched = true;
            try
            {
                Runtime runtime = Runtime.getInstance();
                do
                {
                    Thread.clean();
                    runtime.collectGarbage();
                    pause();
                } while(true);
            }
            catch(Throwable e)
            {
                e.printStackTrace();
            }
        }
    }

    public void interruptio() { throw new SecurityException("невозможно прервать автоматический сбор мусора"); }

    private void pause() throws InterruptedException { synchronized with(fldGarbageCollectorMonitor) { wait(6000L); } }
}