threadprofilereadtime.c
3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/************************************************************************
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;
extern void *__osThprofFunc;
/*
* 該当スレッドの累計timeを取得する
*/
OSTime
osThreadProfileReadTime(OSId id)
{
OSTime adjust = 0;
u32 now_time,last_time;
u32 mask;
OSTime thread_time;
/* 途中での割り込みで計算に不具合が出ないよう割り込みを禁止 */
mask = __osDisableInt();
now_time = osGetCount();
last_time = __osThprofLastTimer;
/* スレッドIDが規定値内かどうかをチェック */
if (id >= THPROF_IDMAX){
__osRestoreInt(mask);
#ifdef _DEBUG
__osError(ERR_OSTHPROFILEREADTIME_LAR,1,id);
#endif /* _DEBUG */
return 0;
}
thread_time = thprof[id].time;
__osRestoreInt(mask);
#ifdef _DEBUG
/* まだイニシャライズされていないときは操作できない */
if (!__osThprofFlag) {
__osError(ERR_OSTHPROFILEREADTIME_FLAG, 0);
return 0;
}
#endif /* _DEBUG */
/* カレントスレッドで、現在プロファイル中なら補正値を足して出力 */
if ((id == osGetThreadId(NULL))&&(__osThprofFunc)){
adjust = (OSTime)(now_time - last_time);
}
return thread_time + adjust;
}
/*
* 該当スレッドの累計timeを取得する (OSThread*版)
*/
OSTime
osThreadProfileReadTimeTh(OSThread *thread)
{
OSId id;
OSTime adjust = 0;
u32 now_time,last_time;
u32 mask;
OSTime thread_time;
/* 途中での割り込みで計算に不具合が出ないよう割り込みを禁止 */
mask = __osDisableInt();
now_time = osGetCount();
last_time = __osThprofLastTimer;
/* スレッドIDが規定値内かどうかをチェック */
id = osGetThreadId(thread);
if (id >= THPROF_IDMAX){
__osRestoreInt(mask);
#ifdef _DEBUG
__osError(ERR_OSTHPROFILEREADTIMETH_LAR,1,id);
#endif /* _DEBUG */
return 0;
}
thread_time = thprof[id].time;
__osRestoreInt(mask);
#ifdef _DEBUG
/* まだイニシャライズされていないときは操作できない */
if (!__osThprofFlag) {
__osError(ERR_OSTHPROFILEREADTIMETH_FLAG, 0);
return 0;
}
#endif /* _DEBUG */
/* カレントスレッドで、現在プロファイル中なら補正値を足して出力 */
if ((id == osGetThreadId(NULL))&&(__osThprofFunc)){
adjust = (OSTime)(now_time - last_time);
}
return thread_time + adjust;
}
#endif /* #ifndef _FINALROM */