remove system constants

This commit is contained in:
nakst 2021-09-09 20:28:38 +01:00
parent ba8c1152c1
commit bb7bf3300a
11 changed files with 48 additions and 76 deletions

View File

@ -523,7 +523,7 @@ void _start() {
nonBlockingTaskWorkAvailable = EsEventCreate(true /* autoReset */);
EsThreadInformation _nonBlockingTaskThread = {};
for (uintptr_t i = 0; i < EsSystemGetConstant(ES_SYSTEM_CONSTANT_OPTIMAL_WORK_QUEUE_THREAD_COUNT); i++) {
for (uintptr_t i = 0; i < EsSystemGetOptimalWorkQueueThreadCount(); i++) {
EsThreadCreate(NonBlockingTaskThread, &_nonBlockingTaskThread, nullptr);
}

View File

@ -116,7 +116,6 @@ struct {
Array<MountPoint> mountPoints;
bool foundBootFileSystem;
EsProcessStartupInformation *startupInformation;
uint64_t systemConstants[ES_SYSTEM_CONSTANT_COUNT];
GlobalData *global;
EsMutex messageMutex;
@ -132,7 +131,7 @@ struct {
EsSpinlock performanceTimerStackLock;
#define PERFORMANCE_TIMER_STACK_SIZE (100)
uint64_t performanceTimerStack[PERFORMANCE_TIMER_STACK_SIZE];
double performanceTimerStack[PERFORMANCE_TIMER_STACK_SIZE];
uintptr_t performanceTimerStackCount;
ThreadLocalStorage firstThreadLocalStorage;
@ -905,10 +904,6 @@ EsMessage *EsMessageReceive() {
EsMessageType type = message.message.type;
if (type == ES_MSG_SYSTEM_CONSTANT_UPDATED) {
api.systemConstants[message.message.systemConstantUpdated.index] = message.message.systemConstantUpdated.newValue;
}
if (type == ES_MSG_EYEDROP_REPORT) {
EsMessageSend((EsElement *) message.object, &message.message);
} else if (type == ES_MSG_TIMER) {
@ -1186,8 +1181,8 @@ void EsInstanceSaveComplete(EsMessage *message, bool success) {
message->instanceSave.file->operationComplete = true;
}
uint64_t EsSystemGetConstant(uintptr_t index) {
return api.systemConstants[index];
uintptr_t EsSystemGetOptimalWorkQueueThreadCount() {
return api.startupInformation->optimalWorkQueueThreadCount;
}
void ThreadInitialise(ThreadLocalStorage *local) {
@ -1216,7 +1211,6 @@ extern "C" void _start(EsProcessStartupInformation *_startupInformation) {
// Initialise the API.
_init();
EsSyscall(ES_SYSCALL_SYSTEM_GET_CONSTANTS, (uintptr_t) api.systemConstants, 0, 0, 0);
EsRandomSeed(EsTimeStamp());
ThreadInitialise(&api.firstThreadLocalStorage);
EsMessageMutexAcquire();
@ -1384,7 +1378,7 @@ void EsPerformanceTimerPush() {
EsSpinlockAcquire(&api.performanceTimerStackLock);
if (api.performanceTimerStackCount < PERFORMANCE_TIMER_STACK_SIZE) {
api.performanceTimerStack[api.performanceTimerStackCount++] = EsTimeStamp();
api.performanceTimerStack[api.performanceTimerStackCount++] = EsTimeStampMs();
}
EsSpinlockRelease(&api.performanceTimerStackLock);
@ -1395,8 +1389,8 @@ double EsPerformanceTimerPop() {
EsSpinlockAcquire(&api.performanceTimerStackLock);
if (api.performanceTimerStackCount) {
uint64_t start = api.performanceTimerStack[--api.performanceTimerStackCount];
result = ((double) (EsTimeStamp() - start) / (double) (api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND])) / 1000000.0;
double start = api.performanceTimerStack[--api.performanceTimerStackCount];
result = (EsTimeStampMs() - start) / 1000.0 /* ms to seconds */;
}
EsSpinlockRelease(&api.performanceTimerStackLock);

View File

@ -1732,8 +1732,8 @@ void ProcessAnimations() {
EsMessage m = {};
m.type = ES_MSG_ANIMATE;
int64_t deltaUs = (timeStamp - element->lastTimeStamp) / api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND];
m.animate.deltaMs = deltaUs / 1000;
int64_t deltaMs = (timeStamp - element->lastTimeStamp) / api.startupInformation->timeStampTicksPerMs;
m.animate.deltaMs = deltaMs;
m.animate.complete = true;
if (!m.animate.deltaMs) {
@ -1779,7 +1779,7 @@ void ProcessAnimations() {
waitMs = m.animate.waitMs;
}
element->lastTimeStamp += m.animate.deltaMs * 1000 * api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND];
element->lastTimeStamp += m.animate.deltaMs * api.startupInformation->timeStampTicksPerMs;
UIWindowNeedsUpdate(element->window);
}
@ -2779,7 +2779,6 @@ EsScrollbar *ScrollbarCreate(EsElement *parent, uint64_t flags) {
} else if (message->type == ES_MSG_ANIMATE) {
if (scrollbar->position != scrollbar->smoothScrollTarget) {
double factor = EsCRTexp2f(-5.0f / message->animate.deltaMs);
// EsPrint("%dmcs -> %F\n", message->animate.deltaUs, factor);
scrollbar->position += (scrollbar->smoothScrollTarget - scrollbar->position) * factor;
ScrollbarSetPosition(scrollbar, scrollbar->smoothScrollTarget, true, true);
bool done = scrollbar->position == scrollbar->smoothScrollTarget;

View File

@ -1484,7 +1484,7 @@ struct EsListView : EsElement {
EsMessageSend(this, &m);
return true;
} else if (!ctrl && !alt) {
uint64_t currentTime = EsTimeStamp() / (api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND] * 1000);
uint64_t currentTime = EsTimeStamp() / api.startupInformation->timeStampTicksPerMs;
if (searchBufferLastKeyTime + GetConstantNumber("listViewSearchBufferTimeout") < currentTime) {
searchBufferBytes = 0;
@ -1787,7 +1787,7 @@ struct EsListView : EsElement {
DragSelect();
}
uint64_t currentTime = EsTimeStamp() / (api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND] * 1000);
uint64_t currentTime = EsTimeStamp() / api.startupInformation->timeStampTicksPerMs;
int64_t remainingTime = searchBufferLastKeyTime + GetConstantNumber("listViewSearchBufferTimeout") - currentTime;
if (remainingTime < 0) {

View File

@ -330,10 +330,6 @@ define ES_ERROR_NODE_NOT_LOADED (-71)
define ES_ERROR_DIRECTORY_ENTRY_BEING_REMOVED (-72)
define ES_ERROR_CANCELLED (-73)
define ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND (0)
define ES_SYSTEM_CONSTANT_OPTIMAL_WORK_QUEUE_THREAD_COUNT (1)
define ES_SYSTEM_CONSTANT_COUNT (2)
define ES_INVALID_HANDLE ((EsHandle) (0))
define ES_CURRENT_THREAD ((EsHandle) (0x10))
define ES_CURRENT_PROCESS ((EsHandle) (0x11))
@ -764,31 +760,31 @@ enum EsSyscallType {
// Processing.
ES_SYSCALL_PROCESS_CREATE
ES_SYSCALL_PROCESS_GET_CREATION_ARGUMENT
ES_SYSCALL_THREAD_TERMINATE
ES_SYSCALL_THREAD_CREATE
ES_SYSCALL_WAIT
ES_SYSCALL_PROCESS_TERMINATE
ES_SYSCALL_EVENT_CREATE
ES_SYSCALL_EVENT_SET
ES_SYSCALL_EVENT_RESET
ES_SYSCALL_PROCESS_PAUSE
ES_SYSCALL_PROCESS_CRASH
ES_SYSCALL_THREAD_GET_ID
ES_SYSCALL_PROCESS_GET_STATE
ES_SYSCALL_YIELD_SCHEDULER
ES_SYSCALL_SLEEP
ES_SYSCALL_PROCESS_OPEN
ES_SYSCALL_PROCESS_SET_TLS
ES_SYSCALL_PROCESS_GET_TLS
ES_SYSCALL_PROCESS_GET_STATUS
ES_SYSCALL_EVENT_FORWARD
ES_SYSCALL_EVENT_RESET
ES_SYSCALL_EVENT_SET
ES_SYSCALL_EVENT_SINK_CREATE
ES_SYSCALL_EVENT_SINK_POP
ES_SYSCALL_EVENT_SINK_PUSH
ES_SYSCALL_THREAD_STACK_SIZE
ES_SYSCALL_PROCESS_CRASH
ES_SYSCALL_PROCESS_CREATE
ES_SYSCALL_PROCESS_GET_CREATION_ARGUMENT
ES_SYSCALL_PROCESS_GET_STATE
ES_SYSCALL_PROCESS_GET_STATUS
ES_SYSCALL_PROCESS_GET_TLS
ES_SYSCALL_PROCESS_OPEN
ES_SYSCALL_PROCESS_PAUSE
ES_SYSCALL_PROCESS_SET_TLS
ES_SYSCALL_PROCESS_SHARE
ES_SYSCALL_PROCESS_TERMINATE
ES_SYSCALL_SLEEP
ES_SYSCALL_THREAD_CREATE
ES_SYSCALL_THREAD_GET_ID
ES_SYSCALL_THREAD_STACK_SIZE
ES_SYSCALL_THREAD_TERMINATE
ES_SYSCALL_WAIT
ES_SYSCALL_YIELD_SCHEDULER
// Windowing.
@ -823,15 +819,15 @@ enum EsSyscallType {
// IO.
ES_SYSCALL_NODE_OPEN
ES_SYSCALL_NODE_DELETE
ES_SYSCALL_NODE_MOVE
ES_SYSCALL_NODE_SHARE
ES_SYSCALL_FILE_READ_SYNC
ES_SYSCALL_FILE_WRITE_SYNC
ES_SYSCALL_FILE_RESIZE
ES_SYSCALL_FILE_GET_SIZE
ES_SYSCALL_DIRECTORY_ENUMERATE
ES_SYSCALL_NODE_DELETE
ES_SYSCALL_NODE_MOVE
ES_SYSCALL_FILE_CONTROL
ES_SYSCALL_NODE_SHARE
ES_SYSCALL_DIRECTORY_ENUMERATE
ES_SYSCALL_VOLUME_GET_INFORMATION
// Networking.
@ -851,11 +847,6 @@ enum EsSyscallType {
ES_SYSCALL_PIPE_WRITE
ES_SYSCALL_PIPE_READ
// System information.
ES_SYSCALL_SYSTEM_GET_CONSTANTS
ES_SYSCALL_SYSTEM_TAKE_SNAPSHOT
// Misc.
ES_SYSCALL_PRINT
@ -864,6 +855,7 @@ enum EsSyscallType {
ES_SYSCALL_SHUTDOWN
ES_SYSCALL_POSIX
ES_SYSCALL_DEBUG_COMMAND
ES_SYSCALL_SYSTEM_TAKE_SNAPSHOT
// End.
@ -987,7 +979,6 @@ enum EsMessageType {
// Misc messages:
ES_MSG_EYEDROP_REPORT = 0x5001
ES_MSG_SYSTEM_CONSTANT_UPDATED = 0x5002
ES_MSG_TIMER = 0x5003
ES_MSG_PING = 0x5004 // Sent by Desktop to check processes are processing messages.
ES_MSG_WAKEUP = 0x5005 // Sent to wakeup the message thread, so that it can process locally posted messages.
@ -1727,11 +1718,6 @@ struct EsMessageTabOperation {
EsError error;
};
struct EsMessageSystemConstantUpdated {
uintptr_t index;
uint64_t newValue;
};
struct EsMessageRegisterFileSystem {
EsHandle rootDirectory;
bool isBootFileSystem;
@ -1815,7 +1801,6 @@ struct EsMessage {
// Internal messages:
void *_argument;
EsMessageProcessCrash crash;
EsMessageSystemConstantUpdated systemConstantUpdated;
EsMessageDesktop desktop;
EsMessageEyedrop eyedrop;
EsMessageCreateInstance createInstance;
@ -1901,7 +1886,7 @@ function uintptr_t _EsSyscall(uintptr_t a, uintptr_t b, uintptr_t c, uintptr_t d
// Configuration and settings.
function uint64_t EsSystemGetConstant(uintptr_t index);
function uintptr_t EsSystemGetOptimalWorkQueueThreadCount();
function int64_t EsSystemConfigurationReadInteger(STRING section, STRING key, int64_t defaultValue = 0);
function char *EsSystemConfigurationReadString(STRING section, STRING key, size_t *valueBytes = ES_NULL); // Free with EsHeapFree.

View File

@ -531,11 +531,10 @@ long EsPOSIXSystemCall(long n, long a1, long a2, long a3, long a4, long a5, long
case SYS_clock_gettime: {
// We'll ignore the clockid_t in a1, since we don't have proper timekeeping yet.
struct timespec *tp = (struct timespec *) a2;
uint64_t timeStamp = EsTimeStamp();
uint64_t unitsPerMicrosecond = EsSystemGetConstant(ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND);
uint64_t microseconds = timeStamp / unitsPerMicrosecond;
tp->tv_sec = microseconds / 1000000;
tp->tv_nsec = (microseconds % 1000000) * 1000;
double timeStampMs = EsTimeStampMs();
uint64_t ns = timeStampMs * 1e6;
tp->tv_sec = ns / 1000000000;
tp->tv_nsec = (ns % 1000000000) * 1000;
} break;
case SYS_wait4: {

View File

@ -250,6 +250,8 @@ struct EsProcessStartupInformation {
uintptr_t tlsImageStart;
uintptr_t tlsImageBytes;
uintptr_t tlsBytes; // All bytes after the image are to be zeroed.
uintptr_t timeStampTicksPerMs;
uintptr_t optimalWorkQueueThreadCount;
};
struct _EsPOSIXSyscall {

View File

@ -3,10 +3,10 @@ ThreadLocalStorage *GetThreadLocalStorage() {
}
double EsTimeStampMs() {
if (!api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND]) {
if (!api.startupInformation->timeStampTicksPerMs) {
return 0;
} else {
return (double) EsTimeStamp() / api.systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND] / 1000;
return (double) EsTimeStamp() / api.startupInformation->timeStampTicksPerMs;
}
}

View File

@ -628,6 +628,8 @@ void NewProcess() {
startupInformation->tlsImageStart = application.tlsImageStart;
startupInformation->tlsImageBytes = application.tlsImageBytes;
startupInformation->tlsBytes = application.tlsBytes;
startupInformation->timeStampTicksPerMs = timeStampTicksPerMs;
startupInformation->optimalWorkQueueThreadCount = scheduler.currentProcessorID; // TODO Update this as processors are added/removed.
}
}

View File

@ -1418,15 +1418,6 @@ SYSCALL_IMPLEMENT(ES_SYSCALL_YIELD_SCHEDULER) {
SYSCALL_RETURN(ES_SUCCESS, false);
}
SYSCALL_IMPLEMENT(ES_SYSCALL_SYSTEM_GET_CONSTANTS) {
uint64_t systemConstants[ES_SYSTEM_CONSTANT_COUNT];
EsMemoryZero(systemConstants, sizeof(systemConstants));
systemConstants[ES_SYSTEM_CONSTANT_TIME_STAMP_UNITS_PER_MICROSECOND] = timeStampTicksPerMs / 1000;
systemConstants[ES_SYSTEM_CONSTANT_OPTIMAL_WORK_QUEUE_THREAD_COUNT] = scheduler.currentProcessorID; // TODO Update this as processors are added/removed.
SYSCALL_WRITE(argument0, systemConstants, sizeof(systemConstants));
SYSCALL_RETURN(ES_SUCCESS, false);
}
SYSCALL_IMPLEMENT(ES_SYSCALL_SYSTEM_TAKE_SNAPSHOT) {
SYSCALL_PERMISSION(ES_PERMISSION_TAKE_SYSTEM_SNAPSHOT);

View File

@ -6,7 +6,6 @@ EsPOSIXInitialise=4
EsFileStoreReadAll=5
EsPOSIXSystemCall=6
EsINIParse=7
EsSystemGetConstant=8
EsTakeSystemSnapshot=9
EsListViewFocusItem=10
_EsInstanceCreate=11
@ -444,3 +443,4 @@ EsDrawTextSimple=442
EsColorInterpolate=443
EsBufferReadInt32Endian=444
EsBufferWriteInt32Endian=445
EsSystemGetOptimalWorkQueueThreadCount=446