static void ami_font_cache_cleanup(struct MinList *ami_font_cache_list) { struct nsObject *node; struct nsObject *nnode; struct ami_font_cache_node *fnode; struct TimeVal curtime; if(IsMinListEmpty(ami_font_cache_list)) return; node = (struct nsObject *)GetHead((struct List *)ami_font_cache_list); do { nnode=(struct nsObject *)GetSucc((struct Node *)node); fnode = node->objstruct; GetSysTime(&curtime); SubTime(&curtime, &fnode->lastused); if(curtime.Seconds > 300) { LOG("Freeing %s not used for %ld seconds", node->dtz_Node.ln_Name, curtime.Seconds); DelObject(node); } } while((node=nnode)); /* reschedule to run in five minutes */ ami_schedule(300000, (void *)ami_font_cache_cleanup, ami_font_cache_list); }
VOID _Timer_Stop(Class *cl, Object *o, Msg msg) { struct TimerData *data = INST_DATA(cl, o); gettimeofday(&(data->elapsed_time), NULL); SubTime(&(data->elapsed_time), &(data->start_time)); return; }
void timer_subtime(void *t, struct timeval *dt, struct timeval *st) { struct timer_s *timer = t; if (timer != NULL) { #define TimerBase timer->TimerBase SubTime(dt, st); #undef TimerBase } }
static BOOL ata_Calibrate(struct IORequest* tmr) { register ULONG x; register ULONG scale = 0x8000; // min iterations... volatile register ULONG t = 1; struct timeval t1, t2; D(bug("[ATA ] Calibration started\n")); while (scale <= 0x80000000) { Forbid(); GetSysTime(&t1); for (x = 1; x < scale; x++) t = (((t + x) * t) - x) / x; // add, mul, sub, div, trivial benchmark. GetSysTime(&t2); Permit(); SubTime(&t2, &t1); // ok, it's going to be totally insane, if secs > 1. if (t2.tv_secs != 0) { bug("[ATA ] micro wait useless.\n"); return FALSE; } /* * we expect at least 10000 times longer period, which should be 'achievable' * unlikely we will cross the magic boundary here of 4 billion instructions in 10 millisecond (yielding 400'000MIPS?) * on the other side, if we go as low as 1, then 4 iterations of add/sub/mul/div is perfectly fine yielding a bit more than 400ns... */ if (t2.tv_micro >= 10000) break; scale <<= 1; } D(bug("[ATA ] Executed %ld ops in %ldus\n", scale, t2.tv_micro)); // always round up to the next value.. so 30.9 -> 31, 5.1 -> 6, etc x = (x + t2.tv_micro - 1) / t2.tv_micro; x = (x+9) / 10; bug("[ATA ] Approximate number of iterations per 100 nanoseconds: %ld\n", x); iters_per_100ns = x; return TRUE; }
int main ( int argc, char **argv ) { struct Library * TimerBase; int size=0,i,h=0,m=0,ml=0,s=0; char *exec; struct timeval time1, time2; struct timerequest *tr; if ( argc <= 1 ) { printf ( "timeme 1.0 - Times how long a command takes to execute.\n" ); printf ( "Usage: timeme (command) [params] ...\nContact: [email protected]\n" ); exit ( 0 ); } /* count the arguments */ for ( i=1;i<argc;i++ ) size += strlen ( argv[i] ); size += argc-2; exec = ( char * ) AllocMem ( size+1, MEMF_PUBLIC|MEMF_CLEAR ); /* build the execute line */ sprintf ( exec, "%s", argv[1] ); for ( i=2;i<argc;i++ ) { sprintf ( exec, "%s %s", exec, argv[i] ); } if ( get_sys_time ( &time1 ) ) error_exit ( "Error getting timer.device." ); ( void ) Execute ( exec, 0,0 ); if ( get_sys_time ( &time2 ) ) error_exit ( "Error getting timer.device." ); if ( ! ( tr = create_timer ( UNIT_MICROHZ ) ) ) error_exit ( "Error getting timer.device." ); TimerBase = ( struct Library * ) tr->tr_node.io_Device; SubTime ( &time2,&time1 ); TimerBase = ( struct Library * ) ( -1 ); delete_timer ( tr ); h = time2.tv_secs/3600; m = time2.tv_secs/60; ml = m%60; printf ( "\n-- %d hours, %d minutes, %ld secs, %ld msec --\n", h,ml,time2.tv_secs%60,time2.tv_micro ); FreeMem ( exec, size+1 ); exit ( 0 ); }
static void ami_font_cache_cleanup(struct SkipList *skiplist) { struct ami_font_cache_node *node; struct ami_font_cache_node *nnode; struct TimeVal curtime; node = (struct ami_font_cache_node *)GetFirstSkipNode(skiplist); if(node == NULL) return; do { nnode = (struct ami_font_cache_node *)GetNextSkipNode(skiplist, (struct SkipNode *)node); GetSysTime(&curtime); SubTime(&curtime, &node->lastused); if(curtime.Seconds > 300) { LOG("Freeing font %p not used for %ld seconds", node->skip_node.sn_Key, curtime.Seconds); ami_font_bullet_close(node); RemoveSkipNode(skiplist, node->skip_node.sn_Key); } } while((node = nnode)); /* reschedule to run in five minutes */ ami_schedule(300000, (void *)ami_font_cache_cleanup, ami_font_cache_list); }
static unsigned int CaptureThread(void *params) { int i = 0; NvU64 stime, ctime; NvMediaTime t1 = {0}, t2 = {0}, st = {0}, ct = {0}; CaptureContext *ctx = (CaptureContext *)params; NvMediaVideoSurface *releaseList[4] = {NULL}, **relList; NvMediaRect primarySrcRect; NvMediaPrimaryVideo primaryVideo; primarySrcRect.x0 = 0; primarySrcRect.y0 = 0; primarySrcRect.x1 = ctx->inputWidth; primarySrcRect.y1 = ctx->inputHeight; primaryVideo.next = NULL; primaryVideo.previous = NULL; primaryVideo.previous2 = NULL; primaryVideo.srcRect = &primarySrcRect; primaryVideo.dstRect = NULL; NvSemaphoreDecrement(ctx->semStart, NV_TIMEOUT_INFINITE); if(ctx->timeNotCount) { GetTime(&t1); AddTime(&t1, ctx->last * 1000000LL, &t1); GetTime(&t2); printf("timeNotCount\n"); } GetTime(&st); stime = (NvU64)st.tv_sec * 1000000000LL + (NvU64)st.tv_nsec; while((ctx->timeNotCount? (SubTime(&t1, &t2)): ((unsigned int)i < ctx->last)) && !stop) { GetTime(&ct); ctime = (NvU64)ct.tv_sec * 1000000000LL + (NvU64)ct.tv_nsec; printf("frame=%3d, time=%llu.%09llu[s] \n", i, (ctime-stime)/1000000000LL, (ctime-stime)%1000000000LL); //printf("frame=%3d, time=%llu.%09llu[s] \n", i, (ctime-stime)/1000000000LL, (ctime-stime)%1000000000LL); pthread_mutex_lock(&mutex); // for ControlThread() if(!(capSurf = NvMediaVideoCaptureGetFrame(ctx->capture, ctx->timeout))) { // TBD MESSAGE_PRINTF("NvMediaVideoCaptureGetFrame() failed in %sThread\n", ctx->name); stop = NVMEDIA_TRUE; break; } if(i%3 == 0) // once in three loop = 10 Hz pthread_cond_signal(&cond); // ControlThread() is called pthread_mutex_unlock(&mutex); // for ControlThread() primaryVideo.current = capSurf; primaryVideo.pictureStructure = NVMEDIA_PICTURE_STRUCTURE_TOP_FIELD; if(NVMEDIA_STATUS_OK != NvMediaVideoMixerRender(ctx->mixer, // mixer NVMEDIA_OUTPUT_DEVICE_0, // outputDeviceMask NULL, // background &primaryVideo, // primaryVideo NULL, // secondaryVideo NULL, // graphics0 NULL, // graphics1 releaseList, // releaseList NULL)) // timeStamp { // TBD MESSAGE_PRINTF("NvMediaVideoMixerRender() failed for the top field in %sThread\n", ctx->name); stop = NVMEDIA_TRUE; } primaryVideo.pictureStructure = NVMEDIA_PICTURE_STRUCTURE_BOTTOM_FIELD; if(NVMEDIA_STATUS_OK != NvMediaVideoMixerRender(ctx->mixer, // mixer NVMEDIA_OUTPUT_DEVICE_0, // outputDeviceMask NULL, // background &primaryVideo, // primaryVideo NULL, // secondaryVideo NULL, // graphics0 NULL, // graphics1 releaseList, // releaseList NULL)) // timeStamp { // TBD MESSAGE_PRINTF("NvMediaVideoMixerRender() failed for the bottom field in %sThread\n", ctx->name); stop = NVMEDIA_TRUE; } if(ctx->fileDumpEnabled) { if(!DumpFrame(ctx->fout, capSurf)) { // TBD MESSAGE_PRINTF("DumpFrame() failed in %sThread\n", ctx->name); stop = NVMEDIA_TRUE; } if(!ctx->displayEnabled) releaseList[0] = capSurf; } relList = &releaseList[0]; while(*relList) { if(NvMediaVideoCaptureReturnFrame(ctx->capture, *relList) != NVMEDIA_STATUS_OK) { // TBD MESSAGE_PRINTF("NvMediaVideoCaptureReturnFrame() failed in %sThread\n", ctx->name); stop = NVMEDIA_TRUE; break; } relList++; } if(ctx->timeNotCount) GetTime(&t2); i++; } // while end // Release any left-over frames // if(ctx->displayEnabled && capSurf && capSurf->type != NvMediaSurfaceType_YV16x2) // To allow returning frames after breaking out of the while loop in case of error if(ctx->displayEnabled && capSurf) { NvMediaVideoMixerRender(ctx->mixer, // mixer NVMEDIA_OUTPUT_DEVICE_0, // outputDeviceMask NULL, // background NULL, // primaryVideo NULL, // secondaryVideo NULL, // graphics0 NULL, // graphics1 releaseList, // releaseList NULL); // timeStamp relList = &releaseList[0]; while(*relList) { if(NvMediaVideoCaptureReturnFrame(ctx->capture, *relList) != NVMEDIA_STATUS_OK) MESSAGE_PRINTF("NvMediaVideoCaptureReturnFrame() failed in %sThread\n", ctx->name); relList++; } } NvSemaphoreIncrement(ctx->semDone); return 0; }