version 1.1, 2002/07/24 10:01:39 |
version 1.19, 2018/03/29 01:32:54 |
|
|
#include "private/gc_priv.h" |
/* $OpenXM: OpenXM_contrib2/asir2000/parse/gc_risa.c,v 1.18 2018/03/12 02:37:08 noro Exp $ */ |
|
|
|
#if defined(VISUAL) || defined(__MINGW32__) |
|
#include "private/gcconfig.h" |
|
#endif |
|
#include "gc.h" |
#include <time.h> |
#include <time.h> |
|
#include <signal.h> |
|
|
void error(char *); |
void error(char *); |
|
void int_handler(); |
|
|
int *StackBottom; |
int *StackBottom; |
|
int in_gc, caught_intr; |
|
|
|
void check_caught_intr() |
|
{ |
|
if ( caught_intr == 1 ) { |
|
caught_intr = 0; |
|
int_handler(SIGINT); |
|
} else if ( caught_intr == 2 ) { |
|
caught_intr = 0; |
|
ox_usr1_handler(SIGUSR1); |
|
} |
|
} |
|
|
void *Risa_GC_malloc(size_t d) |
void *Risa_GC_malloc(size_t d) |
{ |
{ |
void *ret; |
void *ret; |
|
|
ret = (void *)GC_malloc(d); |
in_gc = 1; |
if ( !ret ) |
ret = (void *)GC_malloc(d); |
error("GC_malloc : failed to allocate memory"); |
in_gc = 0; |
return ret; |
check_caught_intr(); |
|
if ( !ret ) |
|
error("GC_malloc : failed to allocate memory"); |
|
return ret; |
} |
} |
|
|
void *Risa_GC_malloc_atomic(size_t d) |
void *Risa_GC_malloc_atomic(size_t d) |
{ |
{ |
void *ret; |
void *ret; |
|
|
ret = (void *)GC_malloc_atomic(d); |
in_gc = 1; |
if ( !ret ) |
ret = (void *)GC_malloc_atomic(d); |
error("GC_malloc_atomic : failed to allocate memory"); |
in_gc = 0; |
return ret; |
check_caught_intr(); |
|
if ( !ret ) |
|
error("GC_malloc_atomic : failed to allocate memory"); |
|
return ret; |
} |
} |
|
|
|
void *Risa_GC_malloc_atomic_ignore_off_page(size_t d) |
|
{ |
|
void *ret; |
|
|
|
in_gc = 1; |
|
ret = (void *)GC_malloc_atomic_ignore_off_page(d); |
|
in_gc = 0; |
|
check_caught_intr(); |
|
if ( !ret ) |
|
error("GC_malloc_atomic_ignore_off_page : failed to allocate memory"); |
|
return ret; |
|
} |
|
|
void *Risa_GC_realloc(void *p,size_t d) |
void *Risa_GC_realloc(void *p,size_t d) |
{ |
{ |
void *ret; |
void *ret; |
|
|
ret = (void *)GC_realloc(p,d); |
in_gc = 1; |
if ( !ret ) |
ret = (void *)GC_realloc(p,d); |
error("GC_realloc : failed to reallocate memory"); |
in_gc = 0; |
return ret; |
check_caught_intr(); |
|
if ( !ret ) |
|
error("GC_realloc : failed to reallocate memory"); |
|
return ret; |
} |
} |
|
|
int get_heapsize() |
void Risa_GC_free(void *p) |
{ |
{ |
return GC_heapsize; |
in_gc = 1; |
|
GC_free(p); |
|
in_gc = 0; |
|
check_caught_intr(); |
} |
} |
|
|
int get_allocwords() |
size_t get_heapsize() |
{ |
{ |
return GC_words_allocd_before_gc; |
return GC_get_heap_size(); |
} |
} |
|
|
double gctime; |
#if !defined(BYTES_TO_WORDS) |
static double gcstart,asir_start_time; |
#define BYTES_TO_WORDS(x) ((x)>>2) |
|
#endif |
|
|
|
size_t get_allocwords() |
|
{ |
|
size_t n = GC_get_total_bytes(); |
|
return BYTES_TO_WORDS(n); /* bytes to words */ |
|
} |
|
|
|
static double asir_start_time; |
|
|
double get_clock(), get_rtime(), get_current_time(); |
double get_clock(), get_rtime(), get_current_time(); |
|
|
void rtime_init() |
void rtime_init() |
{ |
{ |
#if defined(i386) && defined(linux) |
#if defined(i386) && defined(linux) |
unsigned short cw; |
unsigned short cw; |
|
|
#define fldcw(addr) __asm("fldcw %0" : : "m" (*addr)) |
#define fldcw(addr) __asm("fldcw %0" : : "m" (*addr)) |
#define fnstcw(addr) __asm("fnstcw %0" : "=m" (*addr) : "0" (*addr)) |
#define fnstcw(addr) __asm("fnstcw %0" : "=m" (*addr) : "0" (*addr)) |
fnstcw(&cw); cw &= 0xfeff; cw |= 0x0200; fldcw(&cw); |
fnstcw(&cw); cw &= 0xfeff; cw |= 0x0200; fldcw(&cw); |
#endif |
#endif |
asir_start_time = get_current_time(); |
asir_start_time = get_current_time(); |
} |
} |
|
|
double get_rtime() |
double get_rtime() |
{ |
{ |
return get_current_time() - asir_start_time; |
return get_current_time() - asir_start_time; |
} |
} |
|
|
#if defined(THINK_C) || defined(__MWERKS__) || defined(VISUAL) || defined(MSWIN32) |
#if defined(VISUAL) || defined(__MINGW32__) |
|
|
#if defined(VISUAL) |
|
#include <windows.h> |
#include <windows.h> |
|
|
extern int recv_intr,doing_batch; |
extern int recv_intr,doing_batch; |
Line 77 void send_intr(); |
|
Line 128 void send_intr(); |
|
|
|
BOOL set_ctrlc_flag(DWORD type) |
BOOL set_ctrlc_flag(DWORD type) |
{ |
{ |
if ( doing_batch ) |
enter_signal_cs(); |
send_intr(); |
if ( doing_batch ) { |
else |
send_intr(); |
recv_intr = 1; |
}else { |
return TRUE; |
recv_intr = 1; |
|
} |
|
leave_signal_cs(); |
|
return TRUE; |
} |
} |
|
|
void register_ctrlc_handler() { |
void register_ctrlc_handler() { |
SetConsoleCtrlHandler((PHANDLER_ROUTINE)set_ctrlc_flag,TRUE); |
SetConsoleCtrlHandler((PHANDLER_ROUTINE)set_ctrlc_flag,TRUE); |
} |
} |
|
|
int mythreadid() { |
int mythreadid() { |
return GetCurrentThreadId(); |
return GetCurrentThreadId(); |
} |
} |
|
|
double get_current_time() |
double get_current_time() |
{ |
{ |
// return (double)clock()/(double)CLOCKS_PER_SEC; |
// return (double)clock()/(double)CLOCKS_PER_SEC; |
return ((double)GetTickCount())/1000.0; |
return ((double)GetTickCount())/1000.0; |
} |
} |
|
|
double get_clock() |
double get_clock() |
{ |
{ |
static int initialized = 0; |
static int initialized = 0; |
static int is_winnt = 0; |
static int is_winnt = 0; |
static HANDLE curproc; |
static HANDLE curproc; |
|
|
if ( !initialized ) { |
if ( !initialized ) { |
OSVERSIONINFO vinfo; |
OSVERSIONINFO vinfo; |
|
|
curproc = GetCurrentProcess(); |
curproc = GetCurrentProcess(); |
vinfo.dwOSVersionInfoSize = sizeof(vinfo); |
vinfo.dwOSVersionInfoSize = sizeof(vinfo); |
GetVersionEx(&vinfo); |
GetVersionEx(&vinfo); |
if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) |
if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) |
is_winnt = 1; |
is_winnt = 1; |
else |
else |
is_winnt = 0; |
is_winnt = 0; |
} |
} |
if ( is_winnt ) { |
if ( is_winnt ) { |
FILETIME c,e,k,u; |
FILETIME c,e,k,u; |
|
|
GetProcessTimes(curproc,&c,&e,&k,&u); |
GetProcessTimes(curproc,&c,&e,&k,&u); |
return ((double)k.dwLowDateTime+(double)u.dwLowDateTime |
return ((double)k.dwLowDateTime+(double)u.dwLowDateTime |
+4294967296.0*((double)k.dwHighDateTime+(double)u.dwHighDateTime))/10000000.0; |
+4294967296.0*((double)k.dwHighDateTime+(double)u.dwHighDateTime))/10000000.0; |
} else |
} else |
return get_current_time(); |
return get_current_time(); |
} |
} |
#else |
#elif defined(THINK_C) || defined(__MWERKS__) || defined(MSWIN32) |
double get_current_time() |
double get_current_time() |
{ |
{ |
return get_clock(); |
return get_clock(); |
} |
} |
|
|
double get_clock() |
double get_clock() |
{ |
{ |
clock_t c; |
clock_t c; |
|
|
c = clock(); |
c = clock(); |
return (double)c/(double)CLOCKS_PER_SEC; |
return (double)c/(double)CLOCKS_PER_SEC; |
} |
} |
#endif |
|
|
|
#else |
#else |
#include <sys/time.h> |
#include <sys/time.h> |
|
|
double get_current_time() |
double get_current_time() |
{ |
{ |
struct timeval t; |
struct timeval t; |
struct timezone z; |
struct timezone z; |
|
|
gettimeofday(&t,&z); |
gettimeofday(&t,&z); |
return (double)t.tv_sec + ((double)t.tv_usec)/((double)1000000); |
return (double)t.tv_sec + ((double)t.tv_usec)/((double)1000000); |
} |
} |
|
|
#if defined(_PA_RISC1_1) || defined(__svr4__) || defined(__CYGWIN__) |
#if defined(_PA_RISC1_1) || defined(__svr4__) || defined(__CYGWIN__) |
Line 158 double get_current_time() |
|
Line 210 double get_current_time() |
|
|
|
double get_clock() |
double get_clock() |
{ |
{ |
struct tms buf; |
struct tms buf; |
|
|
times(&buf); |
times(&buf); |
return (double)(buf.tms_utime+buf.tms_stime)/(double)CLK_TCK; |
return (double)(buf.tms_utime+buf.tms_stime)/(double)CLK_TCK; |
} |
} |
#else |
#else |
|
|
#include <sys/time.h> |
|
#include <sys/resource.h> |
#include <sys/resource.h> |
|
|
double get_clock() |
double get_clock() |
{ |
{ |
int tv_sec,tv_usec; |
int tv_sec,tv_usec; |
struct rusage ru; |
struct rusage ru; |
|
|
getrusage(RUSAGE_SELF,&ru); |
getrusage(RUSAGE_SELF,&ru); |
tv_sec = ru.ru_utime.tv_sec + ru.ru_stime.tv_sec; |
tv_sec = ru.ru_utime.tv_sec + ru.ru_stime.tv_sec; |
tv_usec = ru.ru_utime.tv_usec + ru.ru_stime.tv_usec; |
tv_usec = ru.ru_utime.tv_usec + ru.ru_stime.tv_usec; |
return (double)tv_sec+(double)tv_usec/(double)1000000; |
return (double)tv_sec+(double)tv_usec/(double)1000000; |
} |
} |
#endif |
#endif |
#endif |
#endif |
|
|
void GC_timerstart() { |
#if !defined(NO_ASIR_GC) |
gcstart = get_clock(); |
extern int GC_free_space_numerator; |
|
|
|
void Risa_GC_get_adj(int *nm, int *dn) { |
|
*nm = GC_free_space_numerator; |
|
*dn = GC_free_space_divisor; |
} |
} |
|
|
void GC_timerstop() { |
void Risa_GC_set_adj(int nm, int dn) { |
gctime += get_clock() - gcstart; |
GC_free_space_numerator = nm; |
|
GC_free_space_divisor = dn; |
} |
} |
|
#else |
|
void Risa_GC_get_adj(int *nm, int *dn) { |
|
*nm = 1; |
|
*dn = GC_free_space_divisor; |
|
} |
|
|
#if defined(MSWIN32) && !defined(VISUAL) |
void Risa_GC_set_adj(int nm, int dn) { |
|
GC_free_space_divisor = dn/nm; |
|
} |
|
|
|
double GC_get_gctime() { |
|
return 0.0; |
|
} |
|
#endif |
|
|
|
#if defined(MSWIN32) && !defined(VISUAL) && !defined(__MINGW32__) |
#include <signal.h> |
#include <signal.h> |
void process_events() { |
void process_events() { |
if ( check_break() ) |
if ( check_break() ) |
raise(SIGINT); |
raise(SIGINT); |
} |
} |
#endif |
#endif |
|
|
Line 205 int sigsetmask(int mask){ return 0; } |
|
Line 275 int sigsetmask(int mask){ return 0; } |
|
|
|
void process_events() { |
void process_events() { |
|
|
register EvQElPtr q; |
register EvQElPtr q; |
#if 0 |
#if 0 |
extern void (*app_process_events)(); |
extern void (*app_process_events)(); |
#endif |
#endif |
|
|
for (q = (EvQElPtr) GetEventQueue()->qHead; q; q = (EvQElPtr) q->qLink) |
for (q = (EvQElPtr) GetEventQueue()->qHead; q; q = (EvQElPtr) q->qLink) |
if (q->evtQWhat == keyDown && (char) q->evtQMessage == '.') |
if (q->evtQWhat == keyDown && (char) q->evtQMessage == '.') |
if (q->evtQModifiers & cmdKey) { |
if (q->evtQModifiers & cmdKey) { |
raise(SIGINT); break; |
raise(SIGINT); break; |
} |
} |
#if 0 |
#if 0 |
if ( app_process_events ) |
if ( app_process_events ) |
(*app_process_events)(); |
(*app_process_events)(); |
#endif |
#endif |
} |
} |
#endif |
#endif |
|
|
#if defined(VISUAL) && !defined(MSWIN32) |
#if (defined(VISUAL) || defined(__MINGW32__)) && !defined(MSWIN32) |
int sigsetmask(mask) int mask; { return 0; } |
int sigsetmask(mask) int mask; { return 0; } |
|
|
void process_events() { |
void process_events() { |
int c; |
int c; |
|
|
while ( c = read_cons() ) |
while ( c = read_cons() ) |
#if defined(GO32) |
#if defined(GO32) |
if ( c == ('x' & 037 ) ) |
if ( c == ('x' & 037 ) ) |
#else |
#else |
if ( c == ('c' & 037 ) ) |
if ( c == ('c' & 037 ) ) |
#endif |
#endif |
int_handler(); |
int_handler(SIGINT); |
} |
} |
#endif |
#endif |