float getCpuUsage() //获取CPU的占用率 { #if _WIN32_WINNT < 0x0501 return 0.0f; #else static FILETIME prevSysKernel, prevSysUser; static FILETIME prevProcKernel, prevProcUser; static bool isFirstRun = true; FILETIME sysIdle, sysKernel, sysUser; FILETIME procCreation, procExit, procKernel, procUser; if (!GetSystemTimes(&sysIdle, &sysKernel, &sysUser) || !GetProcessTimes(GetCurrentProcess(), &procCreation, &procExit, &procKernel, &procUser)) {// can't get time info so return return -1.; } // check for first call if (isFirstRun) { isFirstRun = false; // save time info before return prevSysKernel.dwLowDateTime = sysKernel.dwLowDateTime; prevSysKernel.dwHighDateTime = sysKernel.dwHighDateTime; prevSysUser.dwLowDateTime = sysUser.dwLowDateTime; prevSysUser.dwHighDateTime = sysUser.dwHighDateTime; prevProcKernel.dwLowDateTime = procKernel.dwLowDateTime; prevProcKernel.dwHighDateTime = procKernel.dwHighDateTime; prevProcUser.dwLowDateTime = procUser.dwLowDateTime; prevProcUser.dwHighDateTime = procUser.dwHighDateTime; return -1.; } ULONGLONG sysKernelDiff = subtractTime(sysKernel, prevSysKernel); ULONGLONG sysUserDiff = subtractTime(sysUser, prevSysUser); ULONGLONG procKernelDiff = subtractTime(procKernel, prevProcKernel); ULONGLONG procUserDiff = subtractTime(procUser, prevProcUser); ULONGLONG sysTotal = sysKernelDiff + sysUserDiff; ULONGLONG procTotal = procKernelDiff + procUserDiff; return (float)((100.0 * procTotal) / sysTotal); #endif }
void Logger::logPrint( bool hex, const char * const filepath, const int line, const int level, const char *fstring, ... ) { if ( level <= mEffectiveLevel ) { char classString[4]; char timeString[64]; char logString[8192]; va_list argPtr; struct timeval timeVal; const char * const file = basename(filepath); if ( level < PANIC || level > DEBUG9 ) Panic( "Invalid logger level %d", level ); strncpy( classString, smCodes[level].c_str(), sizeof(classString) ); gettimeofday( &timeVal, NULL ); #if 0 if ( logRuntime ) { static struct timeval logStart; subtractTime( &timeVal, &logStart ); snprintf( timeString, sizeof(timeString), "%ld.%03ld", timeVal.tv_sec, timeVal.tv_usec/1000 ); } else { #endif char *timePtr = timeString; timePtr += strftime( timePtr, sizeof(timeString), "%x %H:%M:%S", localtime(&timeVal.tv_sec) ); snprintf( timePtr, sizeof(timeString)-(timePtr-timeString), ".%06ld", timeVal.tv_usec ); #if 0 } #endif pid_t tid; #ifdef __FreeBSD__ long lwpid; thr_self(&lwpid); tid = lwpid; if (tid < 0 ) // Thread/Process id #else #ifdef HAVE_SYSCALL #ifdef __FreeBSD_kernel__ if ( (syscall(SYS_thr_self, &tid)) < 0 ) // Thread/Process id # else // SOLARIS doesn't have SYS_gettid; don't assume #ifdef SYS_gettid if ( (tid = syscall(SYS_gettid)) < 0 ) // Thread/Process id #endif // SYS_gettid #endif #endif // HAVE_SYSCALL #endif tid = getpid(); // Process id char *logPtr = logString; logPtr += snprintf( logPtr, sizeof(logString), "%s %s[%d].%s-%s/%d [", timeString, mId.c_str(), tid, classString, file, line ); char *syslogStart = logPtr; va_start( argPtr, fstring ); if ( hex ) { unsigned char *data = va_arg( argPtr, unsigned char * ); int len = va_arg( argPtr, int ); int i; logPtr += snprintf( logPtr, sizeof(logString)-(logPtr-logString), "%d:", len ); for ( i = 0; i < len; i++ ) { logPtr += snprintf( logPtr, sizeof(logString)-(logPtr-logString), " %02x", data[i] ); } } else {