static void read_load_stats(void) { time_t nt; time(&nt); if ((nt-scan[LOAD_TYPE].last_read_sec) >= scan[LOAD_TYPE].rate_sec) { devIocStatsGetCpuUsage(&loadinfo); devIocStatsGetCpuUtilization(&loadinfo); scan[LOAD_TYPE].last_read_sec = nt; } }
static long ai_init(int pass) { long i; if (pass) return 0; /* Create timers */ for (i = 0; i < TOTAL_TYPES; i++) { scanIoInit(&scan[i].ioscan); scan[i].wd = wdogCreate(scan_time, i); scan[i].total = 0; scan[i].on = 0; scan[i].rate_sec = parmTypes[i].scan_rate; } /* Init OSD stuff */ scan_mutex = epicsMutexMustCreate(); devIocStatsInitCpuUsage(); devIocStatsInitCpuUtilization(&loadinfo); devIocStatsInitFDUsage(); devIocStatsInitMemUsage(); devIocStatsInitWorkspaceUsage(); devIocStatsInitSuspTasks(); devIocStatsInitIFErrors(); /* Get initial values of a few things that don't change much */ devIocStatsGetClusterInfo(SYS_POOL, &clustinfo[SYS_POOL]); devIocStatsGetClusterInfo(DATA_POOL, &clustinfo[DATA_POOL]); devIocStatsGetClusterUsage(SYS_POOL, &mbufnumber[SYS_POOL]); devIocStatsGetClusterUsage(DATA_POOL, &mbufnumber[DATA_POOL]); devIocStatsGetCpuUtilization(&loadinfo); devIocStatsGetIFErrors(&iferrors); devIocStatsGetFDUsage(&fdusage); /* Count EPICS records */ if (pdbbase) { DBENTRY dbentry; long status; dbInitEntry(pdbbase,&dbentry); status = dbFirstRecordType(&dbentry); while (!status) { recordnumber += dbGetNRecords(&dbentry); status = dbNextRecordType(&dbentry); } dbFinishEntry(&dbentry); } return 0; }
static void scan_time(int type) { switch(type) { case MEMORY_TYPE: { memInfo meminfo_local = {0.0,0.0,0.0,0.0,0.0,0.0}; memInfo workspaceinfo_local = {0.0,0.0,0.0,0.0,0.0,0.0}; int mbufnumber_local[2] = {0,0}; ifErrInfo iferrors_local = {0,0}; devIocStatsGetMemUsage(&meminfo_local); devIocStatsGetWorkspaceUsage(&workspaceinfo_local); devIocStatsGetClusterUsage(SYS_POOL, &mbufnumber_local[SYS_POOL]); devIocStatsGetClusterUsage(DATA_POOL, &mbufnumber_local[DATA_POOL]); devIocStatsGetIFErrors(&iferrors_local); epicsMutexLock(scan_mutex); meminfo = meminfo_local; workspaceinfo = workspaceinfo_local; mbufnumber[SYS_POOL] = mbufnumber_local[SYS_POOL]; mbufnumber[DATA_POOL] = mbufnumber_local[DATA_POOL]; iferrors = iferrors_local; devIocStatsGetClusterInfo(SYS_POOL, &clustinfo[SYS_POOL]); devIocStatsGetClusterInfo(DATA_POOL, &clustinfo[DATA_POOL]); epicsMutexUnlock(scan_mutex); break; } case LOAD_TYPE: { loadInfo loadinfo_local = {1,0.,0.}; int susptasknumber_local = 0; devIocStatsGetCpuUsage(&loadinfo_local); devIocStatsGetCpuUtilization(&loadinfo_local); devIocStatsGetSuspTasks(&susptasknumber_local); epicsMutexLock(scan_mutex); loadinfo = loadinfo_local; susptasknumber = susptasknumber_local; epicsMutexUnlock(scan_mutex); break; } case FD_TYPE: { fdInfo fdusage_local = {0,0}; devIocStatsGetFDUsage(&fdusage_local); epicsMutexLock(scan_mutex); fdusage = fdusage_local; epicsMutexUnlock(scan_mutex); break; } case CA_TYPE: { unsigned cainfo_clients_local = 0; unsigned cainfo_connex_local = 0; casStatsFetch(&cainfo_connex_local, &cainfo_clients_local); epicsMutexLock(scan_mutex); cainfo_clients = cainfo_clients_local; cainfo_connex = cainfo_connex_local; epicsMutexUnlock(scan_mutex); break; } default: break; } scanIoRequest(scan[type].ioscan); if(scan[type].on) epicsTimerStartDelay(scan[type].wd, scan[type].rate_sec); }