From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/mvdm/softpc.new/host/src/nt_unix.c | 459 +++++++++++++++++++++++++++++ 1 file changed, 459 insertions(+) create mode 100644 private/mvdm/softpc.new/host/src/nt_unix.c (limited to 'private/mvdm/softpc.new/host/src/nt_unix.c') diff --git a/private/mvdm/softpc.new/host/src/nt_unix.c b/private/mvdm/softpc.new/host/src/nt_unix.c new file mode 100644 index 000000000..e89b10b81 --- /dev/null +++ b/private/mvdm/softpc.new/host/src/nt_unix.c @@ -0,0 +1,459 @@ +/***************************************************************************** +* nt_unix.c - miscellaneous stuff that may be needed. * +* File derived from hp_unix.c by Philippa Watson. * +* * +* This version is written/ported for New Technology OS/2 * +* by Andrew Watson * +* * +* Date pending due to ignorance * +* * +* (c) Copyright Insignia Solutions 1991 * +* * +*****************************************************************************/ + +#include +#include "host_def.h" +#include "insignia.h" +#include +#include +#include +#include +#include +#include +#include "xt.h" +#include CpuH +#include "timeval.h" +#include "error.h" +#include "sas.h" +#include "spcfile.h" +#include "idetect.h" +#include "debug.h" +#include "nt_reset.h" +#include "nt_pif.h" + + +/***************************************************************************** +* local #define used for stubbing out functions * +*****************************************************************************/ + +#define STUBBED 1 + +/**** externally visible global variable declarations ****/ + +extern char *_sys_errlist[]; +extern int _sys_nerr; + + +/* Exported Data */ +GLOBAL BOOL ExternalWaitRequest = FALSE; + + +/* Local Module Data */ +HANDLE IdleEvent = NULL; +DWORD MainThreadId = 0; +BOOL NowWaiting = FALSE; + +/***************************************************************************** +* Function: host_get_system_error() * +* This routine processes an error returned by SoftPC. * +* Returns a pointer to an error message (located in a table) that * +* corresponds to the error number passed as a parameter. * +*****************************************************************************/ + +LPSTR host_get_system_error(filename, line, error) +LPSTR filename; +DWORD line; +DWORD error; +{ +static BYTE buf[256]; + +if (error > (DWORD)_sys_nerr) + { + sprintf(buf, "System error %d occurred in %s (line %d)", + error, filename, line); + return(buf); + } +else + return(_sys_errlist[error]); +} + + +/* This section contains host side of idling system */ + +/***************************************************************************** +* Function: host_idle_init() * +* Create Event used in Idling Wait * +*****************************************************************************/ +void host_idle_init(void) +{ + if (IdleEvent != NULL) + return; //Called already + + MainThreadId = GetCurrentThreadId(); + + IdleEvent = CreateEvent((LPSECURITY_ATTRIBUTES) NULL, FALSE, FALSE, NULL); + +#ifndef PROD + if (IdleEvent == NULL) + printf("NTVDM:Idlling Event creation failed. Err %d\n",GetLastError()); +#endif +} + +/***************************************************************************** +* Function: WaitIfIdle() * +* If no counter indications (video, com etc) then do short idle * +* * +*****************************************************************************/ +void WaitIfIdle(void) +{ + DWORD idletime; + + if (IdleDisabledFromPIF) { + return; + } + + + /* + * If its not wow make sure the main thread also gets idled. + */ + if (!VDMForWOW && GetCurrentThreadId() != MainThreadId) + { + ExternalWaitRequest = TRUE; + } + + + // + // Check for invalid conditions + // + if (!IdleEvent || !IdleNoActivity) { + Sleep(0); + return; + } + + NowWaiting = TRUE; + idletime = ienabled ? 10 : 1; + + if (WaitForSingleObject(IdleEvent, idletime) == WAIT_FAILED) { + Sleep(0); + idletime = 0; + } + NowWaiting = FALSE; + +#ifndef MONITOR + if (idletime) { + ActivityCheckAfterTimeSlice(); + } +#endif + +} + + +/***************************************************************************** +* Function: WakeUpNow() * +* The paired counterpart to WaitIfIdle() - the event that was worth waiting * +* for has arrived. Wake CPU up so it can deal with it. * +*****************************************************************************/ +void WakeUpNow(void) +{ + HostIdleNoActivity(); +} + + + +/* HostIdleNoActivity + * + * Set Indicator that video\disk\com\lpt activity + * has happened and wake up sleeping CPU if appears to be sleeping. + */ +void HostIdleNoActivity(void) +{ + + IdleNoActivity=0; + + if (NowWaiting) // critical path do inline.... + PulseEvent(IdleEvent); +} + + + +/***************************************************************************** +* Function: host_release_timeslice() * +*****************************************************************************/ +void host_release_timeslice(void) +{ + DWORD idletime; + + // + // If there is counter idle activity no idling so return immediatly + // + if (!IdleNoActivity || IdleDisabledFromPIF) { + return; + } + + // + // Check for invalid or unsafe conditions + // + if (!IdleEvent || !ienabled) { + Sleep(0); + return; + } + + // + // If pif Foreground priority is set to less than 100 on every timer + // event PrioWaitIfIdle will do a wait, so use minimum delay here. + // + if (WNTPifFgPr < 100) { + idletime = 0; + } + + // + // Normal idling condition, so use sig portion of 55 ms time tick + // + else { + idletime = 25; + } + + NowWaiting = TRUE; + if (WaitForSingleObject(IdleEvent, idletime) == WAIT_FAILED) { + idletime = 0; + Sleep(0); + } + NowWaiting = FALSE; + +#ifndef MONITOR + if (idletime) { + ActivityCheckAfterTimeSlice(); + } +#endif + + + +} + + + +/***************************************************************************** +* Function: PrioWaitIfIdle(Percentage) * +* unsigned char Percentage - Percent of cpu usage desired +* The smaller the number the bigger the delay time +* +*****************************************************************************/ +void PrioWaitIfIdle(unsigned char Percentage) +{ + DWORD idletime; + + + // + // If there is counter idle activity no idling so return immediatly + // + if (!IdleNoActivity) { + return; + } + + // + // Check for invalid conditions + // + if (!IdleEvent) { + Sleep(0); + return; + } + + + idletime = (100 - Percentage) >> 1; // percent of 55ms time tick + + + // + // If idle is disabled, we can't depend on the IdleNoActivity flag + // or if the delay time is less than the system's time slice + // shorten the idle so we don't oversleep + // + if (!ienabled) + idletime >>= 2; + + if (idletime < 10) + idletime >>= 1; + + if (idletime) { + NowWaiting = TRUE; + if (WaitForSingleObject(IdleEvent, idletime) == WAIT_FAILED) { + idletime = 0; + Sleep(0); + } + NowWaiting = FALSE; + } + else { + Sleep(0); + } + +#ifndef MONITOR + if (idletime) { + ActivityCheckAfterTimeSlice(); + } +#endif + +} + + + + +/***************************************************************************** +* function: host_memset() * +* This function does what the traditional memset standard library function* +* does ... i.e. fills a portion of memory with the character represented * +* in val. * +* Returns nothing. * +*****************************************************************************/ + +void host_memset(addr, val, size) +register char * addr; +register char val; +unsigned int size; +{ +memset(addr, val, size); +} + + + +#ifdef NO_LONGER_USED +/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + * Host-specific equivalent of the Unix function localtime(). + ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + +struct host_tm *host_localtime(clock) +long *clock; +{ + SYSTEMTIME now; + SAVED struct host_tm host_now; + + UNUSED(clock); + GetLocalTime(&now); + host_now.tm_sec = (int) now.wSecond; + host_now.tm_min = (int) now.wMinute; + host_now.tm_hour = (int) now.wHour; + host_now.tm_mday = (int) now.wDay; + host_now.tm_mon = (int) now.wMonth - 1; // Unix has 0 based months,NT 1 + host_now.tm_year = (int) now.wYear; + host_now.tm_wday = (int) now.wDayOfWeek; + + host_now.tm_yday = (int) 0; // the base doesn't require these. + host_now.tm_isdst = (int) 0; + return(&host_now); +} +#endif + +/* + * Host-specific equivalent of the Unix function time(). + */ + +long host_time(tloc) +long *tloc; +{ + UNUSED(tloc); + return((long) GetTickCount() / 1000 ); +} + +/* + * Check that the file is a character special device. + */ +boolean host_file_is_char_dev(path) +char *path; +{ + return(FALSE); +} + + +/* + * Looks for a given file name in the 'ntvdm' subdirectory of the + * windows system directory. The full path to the first one found is returned + * in the 'full_path' variable, and as the result of the function. + */ +char *host_find_file(file,full_path,display_error) +char *file,*full_path; +int display_error; +{ + char buffer[MAXPATHLEN]; + WIN32_FIND_DATA match; + HANDLE gotit; + static char sysdir[MAX_PATH]; + static int first = 1; + + if (first) + { + first = 0; + if (GetSystemDirectory(sysdir, MAXPATHLEN) == 0) + { + sysdir[0] = '\0'; + host_error(EG_SYS_MISSING_FILE, ERR_QUIT, file); + return(NULL); + } + } + + if (sysdir[0] != '\0') + { + strcpy(buffer, sysdir); + strcat(buffer, "\\"); + strcat(buffer, file); + } + + if ((gotit = FindFirstFile(buffer, &match)) != (HANDLE)-1) + { + FindClose(gotit); // should check (BOOL) return & then ?? + strcpy(full_path, buffer); + return (full_path); + } + + /* Haven't managed to find the file. Oh dear... */ + switch( display_error ) + { + case SILENT: + return( NULL ); + break; + + case STANDARD: + case CONT_AND_QUIT: + host_error(EG_SYS_MISSING_FILE, ERR_CONT | ERR_QUIT, file); + break; + + default: + host_error(EG_SYS_MISSING_FILE, ERR_QUIT, file); + break; + } + + return (NULL); +} + + + +// +// this stuff needs to be removed +// +static char temp_copyright[] = "SoftPC-AT Version 3\n\r(C)Copyright Insignia Solutions Inc. 1987-1992"; + +static int block_level = 0; + +GLOBAL void host_block_timer() +{ + if(block_level) return; + block_level++; +} + +GLOBAL void host_release_timer() +{ + block_level=0; +} +GLOBAL CHAR * host_get_years() +{ +return ("1987 - 1992"); +} +GLOBAL CHAR * host_get_version() +{ +return("3.00"); +} +GLOBAL CHAR * host_get_unpublished_version() +{ +return(""); +} +GLOBAL CHAR * host_get_copyright() +{ +return(""); +} -- cgit v1.2.3