亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? profiler.c

?? 可用于嵌入式編程學習
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++
Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.

Module Name:  

Abstract:  
 This file implements the NK kernel profiler support.

Functions:


Notes: 

--*/
#define C_ONLY
#include "kernel.h"
#include "romldr.h"
#include "xtime.h"
#include <profiler.h>

#define PROFILEMSG(cond,printf_exp)   \
   ((cond)?(NKDbgPrintfW printf_exp),1:0)

#ifdef KCALL_PROFILE

#include "kcall.h"
KPRF_t KPRFInfo[MAX_KCALL_PROFILE];

#ifdef NKPROF
#define KCALL_NextThread	10	// Next thread's entry in array
#endif
#endif

int (*PProfileInterrupt)(void)=NULL;	// pointer to profiler ISR, 
										// set in platform profiler code

BOOL bProfileTimerRunning=FALSE;		// this variable is used in OEMIdle(), so must be defined even in a non-profiling kernel

#ifdef NKPROF
BOOL bProfileObjCall=FALSE;				// object call profiling flag
//volatile BOOL bProfileKCall=FALSE;		// kcall profiling flag
BOOL bProfileKCall=FALSE;		// kcall profiling flag
BOOL bProfileBuffer=FALSE;				// profile to buffer flag
extern void SC_DumpKCallProfile(DWORD bReset);
extern BOOL ProfilerAllocBuffer(void);
extern BOOL ProfilerFreeBuffer(void);
#endif

#ifdef WINCECODETEST
extern void CT_Profile(DWORD Start);
#endif

// SC_ProfileSyscall - profiler syscall support
void SC_ProfileSyscall(LPXT lpXt)
{
#ifdef NKPROF
	static int scPauseContinueCalls = 0;
	static BOOL bStart = FALSE;

	if (lpXt->dwOp == XTIME_PROFILE_DATA)
	{
		if(!lpXt->dwTime[0])			// if starting profiling
		{
			if(lpXt->dwTime[2] & PROFILE_CONTINUE)
			{
				if(bStart)
				{
					++scPauseContinueCalls;
					// start profiler timer on 0 to 1 transition
					if(1 == scPauseContinueCalls)
					{
						OEMProfileTimerEnable(lpXt->dwTime[1]);
						bProfileTimerRunning = TRUE;
					}
				}
			}
			else if(lpXt->dwTime[2] & PROFILE_PAUSE)
			{
				if(bStart)
				{
					--scPauseContinueCalls;
					// start profiler timer on 1 to 0 transition
					if(!scPauseContinueCalls)
					{
						OEMProfileTimerDisable();
						bProfileTimerRunning = FALSE;
					}
				}
			}
			else 
			{
				OEMProfileTimerDisable();		// disable profiler timer
				bProfileTimerRunning = FALSE;
				bStart = TRUE;
				++scPauseContinueCalls;
				
				dwProfileCount=0;			// clear profile count
				ClearProfileHits();			// reset all profile counts
				
				
				// check object call profile flag
				if (lpXt->dwTime[2] & PROFILE_OBJCALL)
					bProfileObjCall=TRUE;
				else
					bProfileObjCall=FALSE;

				// check kcall profile flag
				if (lpXt->dwTime[2] & PROFILE_KCALL)
				{
					bProfileKCall=TRUE;
					return;
				}
				else
				{
					bProfileKCall=FALSE;
				}

				// check profile to buffer flag
				if (lpXt->dwTime[2] & PROFILE_BUFFER)
				{
					bProfileBuffer=TRUE;
					if (!ProfilerAllocBuffer())
					{
						bProfileBuffer=FALSE;
					}
				}
				else
				{
					bProfileBuffer=FALSE;
				}
				
				
				if (bProfileObjCall)
				{
					// We don't need special timers for this case.
					return;
				}
											// start profiler timer
				if(!(lpXt->dwTime[2] & PROFILE_STARTPAUSED))
				{
					// start profiler timer
					OEMProfileTimerEnable(lpXt->dwTime[1]);
					bProfileTimerRunning = TRUE;
				}
			}	
		}	
		else
		{
			if(bProfileTimerRunning)
			{
				OEMProfileTimerDisable();		// disable profiler timer
				bProfileTimerRunning = FALSE;
			}
			
			// stopping profile
			bStart = FALSE;
			if (bProfileKCall)			// if profile KCALL enabled
			{
                bProfileKCall=FALSE;
				// dump the KCall profile data
				SC_DumpKCallProfile(TRUE);
			}
			else						// else display profile hit report
			{
				ProfilerReport();
			}

			if(bProfileBuffer)
			{
				ProfilerFreeBuffer();
				bProfileBuffer = FALSE;
			}

			bProfileObjCall = FALSE;
			scPauseContinueCalls = 0;
		}
	}
#endif

#ifdef WINCECODETEST
	if (lpXt->dwOp == XTIME_CODETEST)
	{
		// Start/Stop CodeTEST profiling
		CT_Profile(lpXt->dwTime[0]);
	}
#endif
}

void SC_TurnOnProfiling(void) {
	DEBUGMSG(ZONE_ENTRY,(L"SC_TurnOnProfiling entry\r\n"));
	SET_PROFILE(pCurThread);
#if SHx
	ProfileFlag = 1;	// profile status
#endif
	DEBUGMSG(ZONE_ENTRY,(L"SC_TurnOnProfiling exit\r\n"));
}

void SC_TurnOffProfiling(void) {
	DEBUGMSG(ZONE_ENTRY,(L"SC_TurnOffProfiling entry\r\n"));
	CLEAR_PROFILE(pCurThread);
#if SHx
	ProfileFlag = 0;	// profile status
#endif
	DEBUGMSG(ZONE_ENTRY,(L"SC_TurnOffProfiling exit\r\n"));
}

#ifdef KCALL_PROFILE
void GetKCallProfile(KPRF_t *pkprf, int loop, BOOL bReset) {
	KCALLPROFON(26);
	memcpy(pkprf,&KPRFInfo[loop],sizeof(KPRF_t));
	if (bReset && (loop != 26))
		memset(&KPRFInfo[loop],0,sizeof(KPRF_t));
	KCALLPROFOFF(26);
	if (bReset && (loop == 26))
		memset(&KPRFInfo[loop],0,sizeof(KPRF_t));
}
#endif

//
// Convert the number of ticks to microseconds.
//
static DWORD 
local_ScaleDown(DWORD dwIn)
{
    LARGE_INTEGER liFreq;

    SC_QueryPerformanceFrequency(&liFreq);

	return ((DWORD) (((__int64) dwIn * 1000000) / liFreq.LowPart));
}


void SC_DumpKCallProfile(DWORD bReset) {
#ifdef KCALL_PROFILE
	extern DWORD local_ScaleDown(DWORD);
	int loop;
	KPRF_t kprf;
	DWORD min = 0xffffffff, max = 0, total = 0, calls = 0;

#ifdef NKPROF
	calls = local_ScaleDown(1000);
    PROFILEMSG(1,(L"Resolution: %d.%3.3d usec per tick\r\n",calls/1000,calls%1000));
	KCall((PKFN)GetKCallProfile,&kprf,KCALL_NextThread,bReset);
	PROFILEMSG(1,(L"NextThread: Calls=%u Min=%u Max=%u Ave=%u\r\n",
		kprf.hits,local_ScaleDown(kprf.min),
		local_ScaleDown(kprf.max),kprf.hits ? local_ScaleDown(kprf.total)/kprf.hits : 0));
	for (loop = 0; loop < MAX_KCALL_PROFILE; loop++) {
		if (loop != KCALL_NextThread) {
			KCall((PKFN)GetKCallProfile,&kprf,loop,bReset);
			if (kprf.max > max)
				max = kprf.max;
			total+=kprf.total;
			calls+= kprf.hits;
		}
	}
	PROFILEMSG(1,(L"Other Kernel calls: Max=%u Avg=%u\r\n",max,calls ? local_ScaleDown(total)/calls : 0));
#else
	calls = local_ScaleDown(1000);
	PROFILEMSG(1,(L"Resolution: %d.%3.3d usec per tick\r\n",calls/1000,calls%1000));
	PROFILEMSG(1,(L"Index Entrypoint                        Calls      uSecs    Min    Max    Ave\r\n"));
	for (loop = 0; loop < MAX_KCALL_PROFILE; loop++) {
		KCall((PKFN)GetKCallProfile,&kprf,loop,bReset);
		PROFILEMSG(1,(L"%5d %-30s %8d %10d %6d %6d %6d\r\n",
			loop, pKCallName[loop], kprf.hits,local_ScaleDown(kprf.total),local_ScaleDown(kprf.min),
			local_ScaleDown(kprf.max),kprf.hits ? local_ScaleDown(kprf.total)/kprf.hits : 0));
		if (kprf.min && (kprf.min < min))
			min = kprf.min;
		if (kprf.max > max)
			max = kprf.max;
		calls += kprf.hits;
		total += kprf.total;
	}
	PROFILEMSG(1,(L"\r\n"));
	PROFILEMSG(1,(L"      %-30s %8d %10d %6d %6d %6d\r\n",
		L"Summary", calls,local_ScaleDown(total),local_ScaleDown(min),local_ScaleDown(max),calls ? local_ScaleDown(total)/calls : 0));
#endif
#endif
}



#ifdef CELOG

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// CELOG RESYNC API:  This function generates a series of calls to CeLogData, 
// to log all currently-existing processes and threads.
//

// This buffer is used during resync to minimize stack usage
BYTE g_pCeLogSyncBuffer[(MAX_PATH * sizeof(WCHAR))
                        + max(sizeof(CEL_PROCESS_CREATE), sizeof(CEL_THREAD_CREATE))];

// Helper func to generate a celog process create event, minimizing stack usage.
// At most one of lpProcNameA, lpProcNameW can be non-null!
_inline void CELOG_SyncProcess(HANDLE hProcess, LPSTR lpProcNameA, LPWSTR lpProcNameW)
{
    PCEL_PROCESS_CREATE pcl = (PCEL_PROCESS_CREATE) &g_pCeLogSyncBuffer;
    WORD wLen = 0;

    pcl->hProcess = hProcess;

    if (lpProcNameW) {
        wLen = strlenW(lpProcNameW) + 1;
        kstrcpyW(pcl->szName, lpProcNameW); 
    } else if (lpProcNameA) {
        wLen = strlen(lpProcNameA) + 1;
        KAsciiToUnicode(pcl->szName, lpProcNameA, MAX_PATH);
    }

    CELOGDATA(TRUE, CELID_PROCESS_CREATE, (PVOID) pcl, (WORD) (sizeof(CEL_PROCESS_CREATE) + (wLen * sizeof(WCHAR))), 0, CELZONE_PROCESS);
}

// Helper func to generate a celog thread create event, minimizing stack usage.
_inline void CELOG_SyncThread(PTHREAD pThread, HANDLE hProcess)
{
    if (pThread) {
        PCEL_THREAD_CREATE pcl = (PCEL_THREAD_CREATE) &g_pCeLogSyncBuffer;
        WORD wLen = 0;

        pcl->hProcess = hProcess;
        pcl->hThread  = pThread->hTh;
        
        // Look up the thread's function name and module handle.
        GetThreadName(pThread, &(pcl->hModule), pcl->szName);
        if (pcl->szName[0] != 0) {
            wLen = strlenW(pcl->szName) + 1;
        }
        
        CELOGDATA(TRUE, CELID_THREAD_CREATE, (PVOID) pcl, 
                  (WORD)(sizeof(CEL_THREAD_CREATE) + (wLen * sizeof(WCHAR))),
                  0, CELZONE_THREAD);
    }
}


BOOL CeLogReSync()
{
    DWORD   dwProc;
    
    // KCall so nobody changes ProcArray out from under us
    if (!InSysCall()) {
        return KCall((PKFN)CeLogReSync);
    }
    
    KCALLPROFON(74);

    // Since we're in a KCall, we must limit stack usage, so we can't call 
    // CELOG_ProcessCreate or CELOG_ThreadCreate -- instead use CELOG_Sync*.
    
    for (dwProc = 0; dwProc < 32; dwProc++) {

        if (ProcArray[dwProc].dwVMBase) {

            THREAD* pThread;
            
            // Log the process name.  Since we are in a KCall, we must use the 
            // table of contents for everything besides nk.exe, because we
            // cannot reach into the memory owned by other processes.
            if (dwProc == 0) {
                // NK.EXE
                
                CELOG_SyncProcess(ProcArray[dwProc].hProc, NULL,
                                  ProcArray[dwProc].lpszProcName);

            } else if ((ProcArray[dwProc].oe.filetype == FT_ROMIMAGE)
                       && (ProcArray[dwProc].oe.tocptr)) {
                // Get the name from the TOC
                
                CELOG_SyncProcess(ProcArray[dwProc].hProc,
                                  ProcArray[dwProc].oe.tocptr->lpszFileName, NULL);
            
            } else {
                // We can't do anything if the process isn't nk.exe and isn't
                // in the table of contents.
                
                CELOG_SyncProcess(ProcArray[dwProc].hProc, NULL, NULL);
            }

            // Log the existence of each of the process' threads as a ThreadCreate
            pThread = ProcArray[dwProc].pTh;
            while (pThread != NULL) {
                CELOG_SyncThread(pThread, pThread->pOwnerProc->hProc);
                pThread = pThread->pNextInProc;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产麻豆| 亚洲综合999| 亚洲久草在线视频| 久久精品国产99久久6| 972aa.com艺术欧美| 欧美精品一区二区精品网| 亚洲线精品一区二区三区| 成人免费三级在线| 精品国产成人在线影院| 亚洲成人午夜电影| 一本到高清视频免费精品| 久久一夜天堂av一区二区三区| 亚洲国产精品自拍| 91亚洲午夜精品久久久久久| 久久五月婷婷丁香社区| 麻豆精品一区二区av白丝在线| 91丨porny丨最新| 国产精品卡一卡二卡三| 国产麻豆成人精品| 欧美成人艳星乳罩| 蜜桃一区二区三区在线| 欧美男同性恋视频网站| 亚洲一级二级在线| 日本久久一区二区| 亚洲人xxxx| thepron国产精品| 国产精品入口麻豆原神| 成人一级视频在线观看| 国产欧美精品区一区二区三区 | 欧美另类z0zxhd电影| 亚洲男人的天堂网| 色综合久久中文字幕综合网| 国产精品久久99| 91一区二区在线观看| 亚洲欧洲性图库| 91丨porny丨蝌蚪视频| 亚洲女同一区二区| 欧美日韩在线观看一区二区| 性感美女极品91精品| 欧美电影在哪看比较好| 日本一不卡视频| 精品国产91久久久久久久妲己| 久久精品国产精品青草| 久久九九99视频| 99视频一区二区| 一区二区三区在线高清| 欧美中文字幕一区二区三区 | 亚洲欧美另类久久久精品2019| 99视频超级精品| 亚洲国产精品天堂| 欧美一二三在线| 国产精品一品视频| 亚洲国产精品t66y| 在线亚洲欧美专区二区| 天天综合天天做天天综合| 精品久久久久一区| www.成人网.com| 天堂成人国产精品一区| 精品久久五月天| av电影在线观看一区| 亚洲综合视频网| 日韩美女视频在线| 91视频你懂的| 激情综合一区二区三区| 国产精品色一区二区三区| 欧美日韩一区二区三区四区五区 | 亚洲国产乱码最新视频| 精品精品欲导航| 麻豆国产欧美日韩综合精品二区| 欧美日韩国产三级| 亚洲午夜日本在线观看| 国产一区二区三区在线观看精品 | 欧美日韩国产一区| 国产一区二区在线视频| 亚洲欧美日韩国产综合| 欧美xxx久久| 欧美中文字幕久久| 国产精品自在欧美一区| 偷拍自拍另类欧美| 国产精品麻豆久久久| 欧美大肚乱孕交hd孕妇| 色综合天天性综合| 国内成+人亚洲+欧美+综合在线| 亚洲视频免费在线| 久久婷婷综合激情| 欧美精品色综合| 色国产精品一区在线观看| 国产精品一区二区三区99| 婷婷夜色潮精品综合在线| 国产精品萝li| 久久久精品黄色| 91精品国产91热久久久做人人| 99久久精品国产网站| 韩国女主播一区| 蜜桃一区二区三区四区| 一级中文字幕一区二区| 成人免费在线视频观看| 久久色中文字幕| 日韩欧美在线1卡| 欧美精品自拍偷拍动漫精品| 色八戒一区二区三区| 99久久国产综合精品色伊| 国产成人精品免费视频网站| 精品综合免费视频观看| 美腿丝袜亚洲一区| 丝袜a∨在线一区二区三区不卡| 亚洲毛片av在线| ●精品国产综合乱码久久久久| 久久老女人爱爱| 久久综合色综合88| 久久一区二区三区四区| 久久综合五月天婷婷伊人| 精品免费日韩av| 日韩精品一区二区三区swag| 日韩午夜av一区| 日韩欧美国产一区在线观看| 欧美xxxxx牲另类人与| 精品久久久久一区| 国产亚洲一区二区三区| 国产亚洲精品资源在线26u| 久久一区二区视频| 中文字幕第一页久久| 亚洲欧洲日产国码二区| 日韩理论片一区二区| 亚洲一区二区在线免费观看视频| 亚洲第一搞黄网站| 免费高清在线视频一区·| 精品影视av免费| 成人av在线观| 91福利在线导航| 91精品国产综合久久精品麻豆 | 欧美一区二区不卡视频| 日韩精品专区在线影院观看 | 成人小视频免费在线观看| 波多野洁衣一区| 欧美无乱码久久久免费午夜一区| 91麻豆精品国产91久久久久久 | caoporn国产一区二区| 色伊人久久综合中文字幕| 欧美日韩一区不卡| www激情久久| 亚洲天堂成人在线观看| 日韩精品一二区| 国产91丝袜在线播放0| 一本久道久久综合中文字幕| 69堂成人精品免费视频| 国产视频一区在线播放| 亚洲综合偷拍欧美一区色| 美女www一区二区| 91啦中文在线观看| 日韩精品一区在线观看| 亚洲啪啪综合av一区二区三区| 日本成人在线视频网站| 成人丝袜高跟foot| 日韩一区二区三区高清免费看看| 国产欧美视频在线观看| 亚洲成人www| 不卡一二三区首页| 51精品国自产在线| 国产精品初高中害羞小美女文| 樱桃视频在线观看一区| 国产在线精品国自产拍免费| 欧美亚洲一区二区三区四区| 久久久不卡网国产精品二区| 亚洲国产裸拍裸体视频在线观看乱了 | 成人夜色视频网站在线观看| 在线电影一区二区三区| 国产精品高潮呻吟| 精品一区二区三区视频在线观看| 99综合电影在线视频| 精品国产一区二区亚洲人成毛片| 亚洲综合一区二区精品导航| 99视频国产精品| 国产日韩欧美电影| 国产综合色精品一区二区三区| 欧美日韩精品三区| 一区二区三区四区视频精品免费 | 91精品国产色综合久久| 亚洲乱码国产乱码精品精98午夜| 国产精品中文欧美| 欧美成人在线直播| 免费在线观看一区| 欧美性猛交xxxx乱大交退制版| |精品福利一区二区三区| 国产成人综合视频| 26uuu久久天堂性欧美| 麻豆国产欧美日韩综合精品二区| 欧美日本在线视频| 午夜欧美2019年伦理| 欧美网站一区二区| 亚洲电影视频在线| 欧美三级资源在线| 午夜精品在线视频一区| 欧美日韩国产一级二级| 亚洲成人av一区二区| 欧美人与禽zozo性伦| 日韩综合小视频| 3atv一区二区三区| 日本欧美久久久久免费播放网| 在线电影院国产精品|