threadprofilestop.c 1.99 KB
/************************************************************************
 Copyright (C) 1999 NINTENDO CO,Ltd,
 Copyright (C) 1999 MONEGI CORPORATION,
        All Rights Reserved
This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp.
and it is not to be reproduced, published, disclosed to others, copied,
adapted, distributed, or displayed without the prior authorization of
NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed
this Notice on all copies of the program, including partial copies or
modified versions thereof.
*************************************************************************/
/************************************************************************
 $Date: 2002/10/29 08:06:43 $
 $Revision: 1.1.1.1 $
 $Author: blythe $
************************************************************************/

#ifndef _FINALROM

#include <rdb.h>
#include <os_internal.h>
#include <os_thread.h>
#include "osint.h"

extern u32 __osThprofLastTimer;

/*
 * プロファイラの処理を停止する
 */
void
osThreadProfileStop( void )
{
    register u32 saveMask;
    int i;
    OSId id;
    u32 now_time;

    /* 誤差を最小限にするため、先に時間を取得する */
    now_time = osGetCount();

    /* Turn off */
    saveMask = __osDisableInt();

#ifdef _DEBUG
    /* まだイニシャライズされていないときは操作できない */
    if (!__osThprofFlag) {
	__osRestoreInt(saveMask);
        __osError(ERR_OSTHPROFILESTOP_FLAG, 0);
	return;
    }
#endif /* _DEBUG */
    
    /* アクティブなスレッドの時間を補正する */
    if (__osThprofFunc){
	id = osGetThreadId(NULL);
	if (id < THPROF_IDMAX){
	    thprof[id].time += (OSTime)(now_time - __osThprofLastTimer);
	}else{
#ifdef _DEBUG
	    /* カレントのスレッド ID が規定外なのでエラー表示 */
	    __osRestoreInt(saveMask);
	    __osError(ERR_OSTHPROFILESTOP_LAR,1,id);
	    saveMask = __osDisableInt();
#endif
	}
    }
    
    __osThprofFunc = NULL;
    for(i=0;i<THPROF_IDMAX;i++)
	thprof[i].flag = 0;

    __osRestoreInt(saveMask);

}

#endif /* #ifndef _FINALROM */