📄 alarm.c
字号:
#line 83 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"#include "mal_config.h"#include "alarm.h"#include <time.h>#ifdef WIN32#ifndef LIBALARM#define alarm_export extern __declspec(dllimport)#else#define alarm_export extern __declspec(dllexport)#endif#else#define alarm_export extern#endifalarm_export str ALARMprelude(void);alarm_export str ALARMepilogue(void);alarm_export str ALARMusec(lng *ret);alarm_export str ALARMsleep(int *res, int *secs);alarm_export str ALARMsetalarm(int *res, int *secs, str *action);alarm_export str ALARMtimers(int *res);alarm_export str ALARMctime(str *res);alarm_export str ALARMepoch(int *res);alarm_export str ALARMtime(int *res);static monet_timer_t timer[MAXtimer];static int timerTop = 0;#line 116 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"#ifdef SIGALRMvoidCLKinitTimer(int sec, int usec){ int i = sec - time(0); (void) usec; TRGDEBUG THRprintf(GDKout, "#CLKinitTimer: set timer to %d secs \n", i); alarm(i);}#endif#line 132 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"#ifdef SIGALRMvoidCLKalarm(time_t t, str action){ int j; int k; TRGDEBUG THRprintf(GDKout, "#CLKalarm: push " LLFMT "\n", (lng) t); if (timerTop == MAXtimer) { GDKerror("CLKalarm: timer stack overflow\n"); return; } for (j = 0; j < timerTop; j++) { if (timer[j].alarm_time > t) break; } for (k = timerTop; k > j; k--) { timer[k] = timer[k - 1]; } timer[k].alarm_time = t; if (action) { timer[k].action = GDKstrdup(action); } else { timer[k].action = 0; MT_init_sema(timer[k].sema, 0); } if (k == timerTop++) { CLKinitTimer(t, 0); /* set it sooner */ }}#endif#line 168 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"#ifdef SIGALRM/* HACK to pacify compiler */#if (defined(__INTEL_COMPILER) && (SIZEOF_VOID_P > SIZEOF_INT))#undef SIG_ERR /*((__sighandler_t)-1 ) */#define SIG_ERR ((__sighandler_t)-1L)#endifstatic RETSIGTYPECLKsignal(int nr){ /* int restype; */ int k = timerTop; int t; (void) nr; if (signal(SIGALRM, CLKsignal) == SIG_ERR) { GDKsyserror("CLKsignal: call failed\n"); } TRGDEBUG THRprintf(GDKout, "#alarm signal (timeTop=%d)\n", timerTop); if (timerTop == 0) { return; } t = time(0); while (k-- && t >= timer[k].alarm_time) { if (timer[k].action) { TRGDEBUG THRprintf(GDKout, "#eval(%s)\n", timer[k].action); /* monet_eval(timer[k].action, &restype); */ GDKfree(timer[k].action); } else { MT_up_sema(timer[k].sema, "CLKsignal"); } timerTop--; } if (timerTop > 0) { CLKinitTimer(timer[timerTop - 1].alarm_time, 0); }}#endifbat *CLKprelude(void){#ifdef SIGALRM (void) signal(SIGALRM, CLKsignal);#endif return NULL;}voidCLKepilogue(void){ int k;#if (defined(SIGALRM) && defined(SIG_IGN))/* HACK to pacify compiler */#if (defined(__INTEL_COMPILER) && (SIZEOF_VOID_P > SIZEOF_INT))#undef SIG_IGN /*((__sighandler_t)1 ) */#define SIG_IGN ((__sighandler_t)1L)#endif (void) signal(SIGALRM, SIG_IGN);#endif for (k = 0; k < timerTop; k++) { if (timer[k].action) GDKfree(timer[k].action); }}intCMDsleep(int *secs){ if (*secs < 0) { GDKerror("CMDsleep: negative delay\n"); return GDK_FAIL; } else {#ifdef __CYGWIN__ /* CYGWIN cannot handle SIGALRM with sleep */ lng t = GDKusec() + (*secs)*1000000; while (GDKusec() < t) ;#else MT_sleep_ms(*secs * 1000);#endif } return GDK_SUCCEED;}intCMDalarm(int *secs, str action){ if (*secs < 0) { GDKerror("CMDalarm: negative delay\n"); return GDK_FAIL; } else {#ifndef SIGALRM (void)action; GDKerror("CMDalarm: not implemented\n"); return GDK_FAIL;#else CLKalarm(time(0) + *secs, action);#endif } return GDK_SUCCEED;}#line 284 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"intCMDtimers(BAT **retval){ char buf[27]; int k; *retval = BATnew(TYPE_str, TYPE_str, timerTop); if (*retval == NULL) return GDK_FAIL; BATroles(*retval, "alarm", "action"); for (k = 0; k < timerTop; k++) { time_t t = timer[k].alarm_time;#ifdef HAVE_CTIME_R3 ctime_r(&t, buf, sizeof(buf));#else#ifdef HAVE_CTIME_R ctime_r(&t, buf);#else strncpy(buf, ctime(&t), sizeof(buf));#endif#endif BUNins(*retval, buf, timer[k].action ? timer[k].action : "barrier", FALSE); } return GDK_SUCCEED;}intCMDctime(str *retval){ time_t t = time(0);#ifdef HAVE_CTIME_R3 char buf[26]; *retval = GDKstrdup(ctime_r(&t, buf, sizeof(buf)));#else#ifdef HAVE_CTIME_R char buf[26]; *retval = GDKstrdup(ctime_r(&t, buf));#else *retval = GDKstrdup(ctime(&t));#endif#endif return GDK_SUCCEED;}intCMDepoch(int *retval) /* XXX should be lng */{ *retval = (int) time(0); return GDK_SUCCEED;}/* should return lng */intCMDusec(lng *retval){ *retval = GDKusec(); return GDK_SUCCEED;}intCMDtime(int *retval){ *retval = GDKms(); return GDK_SUCCEED;}#line 357 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"#include "mal.h"#include "mal_exception.h"voidALARMinitTimer(int sec, int usec){ (void) sec; (void) usec;#ifdef SIGALRM CLKinitTimer(sec, usec);#endif}#ifdef SIGALRMstrALARMalarm(int t, str *action){ CLKalarm(t, *action); return MAL_SUCCEED;}#endifstrALARMprelude(){#ifdef SIGALRM (void) signal(SIGALRM, (void (*)()) CLKsignal);#endif return MAL_SUCCEED;}strALARMepilogue(){ CLKepilogue(); return MAL_SUCCEED;}strALARMusec(lng *ret){ CMDusec(ret); return MAL_SUCCEED;}strALARMsleep(int *res, int *secs){ (void) res; /* fool compilers */ CMDsleep(secs); return MAL_SUCCEED;}strALARMsetalarm(int *res, int *secs, str *action){ (void) res; (void) secs; (void) action; /* foolc compiler */ throw(MAL, "alarm.setalarm", "Not yet implemented");}strALARMtimers(int *res){ (void) res; /* fool compiler */ throw(MAL, "alarm.timers", "Not yet implemented");}strALARMctime(str *res){ CMDctime(res); return MAL_SUCCEED;}strALARMepoch(int *res){ CMDepoch(res); return MAL_SUCCEED;}strALARMtime(int *res){ CMDtime(res); return MAL_SUCCEED;}#line 448 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/kernel/alarm.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -