/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024, 2026 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package platform.dependent;
import avt.io.*;
import platform.independent.filesystem.*;
import platform.independent.osservices.*;
public abstract class PlatformServices(Runtime)
{
private static PlatformServices instance;
public static PlatformServices getInstance() { return instance; }
private static native int getProcessorBrandString(char[] dst);
private String fldProcessorBrandString;
protected () { instance = this; }
/* время */
public abstract int currentOffsetInMillis();
public abstract long currentTimeInMillis();
/* память */
public abstract void deallocateRegion(long2 region, int flags);
public abstract void setRegionProtectionBits(long2 region, int pbits);
public abstract int getRegionProtectionBits(long2 region);
public abstract long2 allocateRegion(long2 region, int flags);
public abstract long2[] enumerateRegions();
/* событие */
public abstract void destroyEvent(long eventDs);
public abstract void setSignalledEvent(long eventDs);
public abstract void clearSignalledEvent(long eventDs);
public abstract void waitSignalledEvent(long eventDs, long timeInMillis, int timeInNanos);
public abstract long createEvent(boolean manualReset, boolean initialState, char[] name);
/* поток исполнения */
public abstract void yieldThread();
public abstract void setThreadPriority(long2 threadId, int priority);
public abstract void setThreadDescription(long2 threadId, byte[] src, int offset, int length);
public abstract boolean isAliveThread(long threadMainId);
public abstract int getThreadPriority(long2 threadId);
public abstract int getThreadDescription(long2 threadId, byte[] dst, int offset);
public abstract int getActiveThreadsQuantity();
public abstract long startThread(Runnable ref);
public abstract long2 getCurrentThreadId();
public abstract long[] getActiveThreadsMainIds();
public abstract Mutex newMutex();
public abstract Monitor newMonitor();
/* процесс */
public abstract void closeProcessDescriptor(long2 procDs);
public abstract void joinProcess(long2 procDs, long timeInMillis, int timeInNanos);
public abstract boolean isProcessTerminated(long2 procDs);
public abstract boolean isPlatformOutputStream(ByteWriter stream);
public abstract boolean isPlatformInputStream(ByteReader stream);
public abstract boolean isCurrentProcessHasInstance();
public abstract int getProcessExitCode(long2 procDs);
public abstract long getCurrentProcessId();
public abstract long2 startProcess(ProcessParameters ref) throws DirectoryNotFoundException, FileNotFoundException, IOException;
public abstract Process getCurrentProcess();
public abstract EnvironmentTable newEnvironmentTable();
public abstract ByteStream newPipe();
public abstract String getConsoleInputCharsetName();
public abstract String getConsoleOutputCharsetName();
/* файловая система */
public abstract boolean isObjectPathCaseSensitive();
public abstract boolean isInternalPathFull(String internalPath);
public abstract FileSystemRoot[] enumerateRoots() throws IOException;
public abstract FileSystemRoot getRoot(String objectPath) throws FileSystemNotFoundException, IOException;
public abstract String getUserConfigDir() throws IOException;
public abstract String getUserCacheDir() throws IOException;
public abstract String getUserLocalDir() throws IOException;
public abstract String toInternalPath(String objectPath);
public abstract String toObjectPath(String internalPath);
/* свойства платформы */
public abstract int processorNumberOfCores { read }
public abstract String operatingSystemName { read }
public abstract String operatingSystemVersion { read }
public abstract String lineSeparator { read }
public final int processorCodeBits { read = 64 }
public final String processorBrandString { read = fldProcessorBrandString }
/* инициализация и финализация */
protected void afterConstruction() {
char[] processorBrandStringChars = new char[48];
int processorBrandStringLength = getProcessorBrandString(processorBrandStringChars);
fldProcessorBrandString = new String(processorBrandStringChars, 0, processorBrandStringLength);
super.afterConstruction();
}
}