void MkBaseThreadUnit::Run(void) { const MkHashStr profKey = MKDEF_PROFILING_PREFIX_FOR_THREAD + GetThreadName().GetString(); MkTimeState lastTimeState; lastTimeState.frameCount = 0xffffffff; // 루핑 진행 while (m_CurrentState == eRunning) { // 현재 time state 얻음 MkTimeState currTimeState; MK_TIME_MGR.GetCurrentTimeState(currTimeState); // 새로운 프레임이면 수행 if (currTimeState.frameCount != lastTimeState.frameCount) { MK_PROF_MGR.Begin(profKey); // profiling start Update(currTimeState); MK_PROF_MGR.End(profKey); // profiling end lastTimeState = currTimeState; } // 동일 시간이면 대기 else { Sleep(1); } } }
void MkLogicThreadUnit::Run(void) { const MkHashStr profKey = MKDEF_PROFILING_PREFIX_FOR_THREAD + GetThreadName().GetString(); // 루핑 진행 while (m_CurrentState == eRunning) { // 프레임 시작 MK_TIME_MGR.Update(); MK_PROF_MGR.Begin(profKey); // profiling start MkTimeState currTimeState; MK_TIME_MGR.GetCurrentTimeState(currTimeState); Update(currTimeState); MK_PROF_MGR.End(profKey); // profiling end } }
void LogBase::WriteVA(ELogMessageType type, ELogMessageLevel nLevel, LPCTSTR pszModule, LPCTSTR pszMessage, va_list args) throw() { if (IsFiltered(type, nLevel)) // не обрабатываем сообщение, если оно не попадает в лог return; // 75% времени тратится на new и delete, поэтому первую попытку попробуем сделать без него. StackResizableBuf<TCHAR, 16*1024> buf; int pos; for (;;) { pos = _vsntprintf_s(buf.data, buf.size, buf.size - 1, pszMessage, args); if (pos != -1) break; // BUG 16456 FIX, см. в конец WriteVAW почему //if (buf.size >= 1024 * 256) if (buf.size >= 1024 * 1024 * 10) //Increased limit for DumpServer { pos = (int)buf.size - 1; break; } buf.Resize(buf.size * 2); } if (pos >= 0) { buf.data[pos] = 0; SYSTEMTIME st; GetLocalTime(&st); TCHAR bufdate[128], buftime[128], bufthread[128]; _stprintf_s(bufdate, _T("%i-%02i-%02i"), st.wYear, st.wMonth, st.wDay); _stprintf_s(buftime, _T("%02i:%02i:%02i.%03d"), st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); _stprintf_s(bufthread, _T("%4x"), GetCurrentThreadId()); m_pMedia->Write(type, nLevel, bufdate, buftime, bufthread, GetThreadName() , pszModule ? pszModule : m_szModule.c_str(), buf.data); } }
void CScriptThread::Run() { bool bEnding = false; volatile uint64 uTime= GetProcessTime(); uint64 uGCTime = uTime; const uint32 uInterval=min<uint32>( 500,CAppConfigServer::Inst()->GetChildVMGCStepInterval() ); const uint32 uStep=CAppConfigServer::Inst()->GetChildVMGCStep(); WatchThread( m_hThread , GetThreadName(), &uTime ,30*1000, 2,5000 ); SQR_TRY { LowerCurThreadPriority(); for(;;) { uTime=GetProcessTime(); while( uTime >= uGCTime ) { uGCTime+=uInterval; GetScript()->GCStep(uStep); } switch( GetSemaphore( &m_smThread,uInterval ) ) { case 1: continue; case 0: break; default: { ostringstream strm; strm<<"GetSemaphore failed with error \""<<strerror(errno)<<"\""; GenErr(strm.str()); } } if( Atomic_Swap( &m_nHasDbResult, 0 ) ) m_pScriptDbHandler->OnSomeQueryJobDone(); if( Atomic_Swap( &m_nHasLeftMsg, 0 ) ) HandleAllLeftMsg(); FlushRightMsg(); if(m_bQuit) { break; } else { if(!bEnding) { if(m_pThreadMgr->m_bQuitSignal) { bEnding = true; m_pHandler->OnEndThread(); } } } } GetScript()->GCAll(); } SQR_CATCH(exp) { LogExp(exp); } SQR_TRY_END; DoNotWatchThread( m_hThread ); }
void LogBase::WriteVAW(ELogMessageType type, ELogMessageLevel nLevel, LPCWSTR pszModule, LPCWSTR pszMessage, va_list args) throw() { #if defined(_UNICODE) || defined(UNICODE) WriteVA(type, nLevel, pszModule, pszMessage, args); #else if (IsFiltered(type, nLevel)) // не обрабатываем сообщение, если оно не попадает в лог return; // 75% времени тратится на new и delete, поэтому первую попытку попробуем сделать без него. StackResizableBuf<WCHAR, 1024> buf; int pos; for (;;) { pos = _vsnwprintf(buf.data, buf.size - 1, pszMessage, args); if (pos != -1) break; // BUG 16456 FIX, см. в конец WriteVAW почему if (buf.size >= 1024 * 256) { pos = buf.size - 1; break; } buf.Resize(buf.size * 2); } if (pos >= 0) { buf.data[pos] = 0; LPTSTR pszStr = static_cast<LPTSTR>(_alloca(buf.size)); if (0 == WideCharToMultiByte(CP_ACP, 0/*WC_DEFAULTCHAR*/, buf.data, pos + 1, pszStr, buf.size, NULL, NULL)) { _RPT1(_CRT_ERROR, "Can't convert Unicode string (error #0x%08X)", GetLastError()); return; } LPCTSTR pszMod; if (pszModule == NULL) pszMod = m_szModule.c_str(); else { size_t nModuleLen = wcslen(pszModule) + 1; LPTSTR pszModBuf = static_cast<LPTSTR>(_alloca(nModuleLen)); if (0 == WideCharToMultiByte(CP_ACP, 0/*WC_DEFAULTCHAR*/, pszModule, nModuleLen, pszModBuf, nModuleLen, NULL, NULL)) { _RPT1(_CRT_ERROR, "Can't convert Unicode string (error #0x%08X)", GetLastError()); return; } pszMod = pszModBuf; } SYSTEMTIME st; GetLocalTime(&st); TCHAR bufdate[128], buftime[128], bufthread[128]; _stprintf(bufdate, _T("%i-%02i-%02i"), st.wYear, st.wMonth, st.wDay); _stprintf(buftime, _T("%02i:%02i:%02i.%03d"), st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); _stprintf(bufthread, _T("%03x"), GetCurrentThreadId()); m_pMedia->Write(type, nLevel, bufdate, buftime, bufthread, GetThreadName(), pszMod, pszStr); } #endif /* BUG 16456 FIX _vsnwprintf спотыкается на строках с символом 0xFFFF, возвращает -1 при любой длине буфера. Соответсвтвенно буфер увеличивается (Resize) пока не хватит памяти, а потом вызывается _vsnwprintf на NULL. Решение: Т.к. _vsnwprintf, даже если нехватает буфера, начало заполняет, то просто ограничим буфер 256кб (а 0 на конце и так ставим на всякий случай) #include <stdarg.h> #include <stdio.h> void WriteVAW(wchar_t* pszMessage, va_list args) { wchar_t buf[1000]; int n = _vsnwprintf(buf, 1000, pszMessage, args); printf("Return %i\nBuf is: \"%ls\"", n, buf); // n будет -1, хотя буфера хватает !!! } void WriteW(wchar_t* pszMessage, ...) { va_list ap; va_start(ap, pszMessage); WriteVAW(pszMessage, ap); va_end(ap); } void main() { WriteW(L"%ls!", L"123\xffff"); } */ }
std::string ProcFS::GetProcessName(pid_t pid) { return GetThreadName(pid, pid); }