static int Jim_AlarmCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int ret; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "seconds"); return JIM_ERR; } else { #ifdef HAVE_UALARM double t; ret = Jim_GetDouble(interp, argv[1], &t); if (ret == JIM_OK) { if (t < 1) { ualarm(t * 1e6, 0); } else { alarm(t); } } #else long t; ret = Jim_GetLong(interp, argv[1], &t); if (ret == JIM_OK) { alarm(t); } #endif } return ret; }
static int Jim_SleepCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int ret; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "seconds"); return JIM_ERR; } else { double t; ret = Jim_GetDouble(interp, argv[1], &t); if (ret == JIM_OK) { #ifdef HAVE_USLEEP if (t < 1) { usleep(t * 1e6); } else #endif sleep(t); } } return ret; }
static int Jim_SleepCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int ret; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "seconds"); return JIM_ERR; } else { double t; ret = Jim_GetDouble(interp, argv[1], &t); if (ret == JIM_OK) { #ifdef HAVE_SELECT struct timeval s; s.tv_sec = (long)t; s.tv_usec = (long)((t - (int)t) * 1e6); select(0, NULL, NULL, NULL, &s); #else #ifdef HAVE_USLEEP usleep((int)((t - (int)t) * 1e6)); #endif sleep(t); #endif } } return ret; }
int Jim_GetOpt_Double(Jim_GetOptInfo *goi, double *puthere) { int r; Jim_Obj *o; double _safe; if (puthere == NULL) puthere = &_safe; r = Jim_GetOpt_Obj(goi, &o); if (r == JIM_OK) { r = Jim_GetDouble(goi->interp, o, puthere); if (r != JIM_OK) Jim_SetResultFormatted(goi->interp, "not a number: %#s", o); } return r; }
static int Jim_LinuxUSleepCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int mult = NSNS ; double floatValue ; const char *units ; long long delay ; int len ; struct timespec tv; switch (argc) { case 3: units = Jim_GetString(argv[2], &len); if (units == NULL) return JIM_ERR; switch (*units) { case 's': mult = S_NS; break; case 'm': mult = MSNS; break; case 'u': mult = USNS; break; case 'n': mult = NSNS; break; default: Jim_WrongNumArgs(interp, 1, argv, "arg3: ms us ns or empty"); return JIM_ERR; } // fallthrough case 2: if (Jim_GetDouble(interp, argv[1], &floatValue) != JIM_OK) return JIM_ERR; delay = (long long)(floatValue * mult); break; default: Jim_WrongNumArgs(interp, 1, argv, "?useconds?"); return JIM_ERR; } tv.tv_sec = delay / S_NS; tv.tv_nsec = delay % S_NS; fprintf(stderr,"delay: %lld mult: %d sec: %ld ns: %ld\n", delay, mult, tv.tv_sec,tv.tv_nsec ); nanosleep(&tv,NULL); return JIM_OK; }
static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_EventLoop *eventLoop = Jim_CmdPrivData(interp); double ms = 0; jim_wide id; Jim_Obj *objPtr, *idObjPtr; static const char * const options[] = { "cancel", "info", "idle", NULL }; enum { AFTER_CANCEL, AFTER_INFO, AFTER_IDLE, AFTER_RESTART, AFTER_EXPIRE, AFTER_CREATE }; int option = AFTER_CREATE; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "option ?arg ...?"); return JIM_ERR; } if (Jim_GetDouble(interp, argv[1], &ms) != JIM_OK) { if (Jim_GetEnum(interp, argv[1], options, &option, "argument", JIM_ERRMSG) != JIM_OK) { return JIM_ERR; } Jim_SetEmptyResult(interp); } else if (argc == 2) { /* Simply a sleep */ usleep(ms * 1000); return JIM_OK; } switch (option) { case AFTER_IDLE: if (argc < 3) { Jim_WrongNumArgs(interp, 2, argv, "script ?script ...?"); return JIM_ERR; } /* fall through */ case AFTER_CREATE: { Jim_Obj *scriptObj = Jim_ConcatObj(interp, argc - 2, argv + 2); Jim_IncrRefCount(scriptObj); id = Jim_CreateTimeHandler(interp, (jim_wide)(ms * 1000), JimAfterTimeHandler, scriptObj, JimAfterTimeEventFinalizer); objPtr = Jim_NewStringObj(interp, NULL, 0); Jim_AppendString(interp, objPtr, "after#", -1); idObjPtr = Jim_NewIntObj(interp, id); Jim_IncrRefCount(idObjPtr); Jim_AppendObj(interp, objPtr, idObjPtr); Jim_DecrRefCount(interp, idObjPtr); Jim_SetResult(interp, objPtr); return JIM_OK; } case AFTER_CANCEL: if (argc < 3) { Jim_WrongNumArgs(interp, 2, argv, "id|command"); return JIM_ERR; } else { jim_wide remain = 0; id = JimParseAfterId(argv[2]); if (id <= 0) { /* Not an event id, so search by script */ Jim_Obj *scriptObj = Jim_ConcatObj(interp, argc - 2, argv + 2); id = JimFindAfterByScript(eventLoop, scriptObj); Jim_FreeNewObj(interp, scriptObj); if (id <= 0) { /* Not found */ break; } } remain = Jim_DeleteTimeHandler(interp, id); if (remain >= 0) { Jim_SetResultInt(interp, remain); } } break; case AFTER_INFO: if (argc == 2) { Jim_TimeEvent *te = eventLoop->timeEventHead; Jim_Obj *listObj = Jim_NewListObj(interp, NULL, 0); char buf[30]; const char *fmt = "after#%" JIM_WIDE_MODIFIER; while (te) { snprintf(buf, sizeof(buf), fmt, te->id); Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, buf, -1)); te = te->next; } Jim_SetResult(interp, listObj); } else if (argc == 3) { id = JimParseAfterId(argv[2]); if (id >= 0) { Jim_TimeEvent *e = JimFindTimeHandlerById(eventLoop, id); if (e && e->timeProc == JimAfterTimeHandler) { Jim_Obj *listObj = Jim_NewListObj(interp, NULL, 0); Jim_ListAppendElement(interp, listObj, e->clientData); Jim_ListAppendElement(interp, listObj, Jim_NewStringObj(interp, e->initialus ? "timer" : "idle", -1)); Jim_SetResult(interp, listObj); return JIM_OK; } } Jim_SetResultFormatted(interp, "event \"%#s\" doesn't exist", argv[2]); return JIM_ERR; } else { Jim_WrongNumArgs(interp, 2, argv, "?id?"); return JIM_ERR; } break; } return JIM_OK; }