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
	}
}
Beispiel #3
0
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);
    }
}
Beispiel #4
0
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 );
}
Beispiel #5
0
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");
    }
    */
}
Beispiel #6
0
std::string ProcFS::GetProcessName(pid_t pid) {
  return GetThreadName(pid, pid);
}