Skip to content
Snippets Groups Projects
Commit ec7b204e authored by Tofu Linden's avatar Tofu Linden
Browse files

shuffle shuffle of timer code. cleanup.

parent 563daa96
No related branches found
No related tags found
No related merge requests found
...@@ -50,7 +50,7 @@ set(llcommon_SOURCE_FILES ...@@ -50,7 +50,7 @@ set(llcommon_SOURCE_FILES
lleventdispatcher.cpp lleventdispatcher.cpp
lleventfilter.cpp lleventfilter.cpp
llevents.cpp llevents.cpp
llfasttimer.cpp llfasttimer_class.cpp
llfile.cpp llfile.cpp
llfindlocale.cpp llfindlocale.cpp
llfixedbuffer.cpp llfixedbuffer.cpp
......
/**
* @file llfasttimer.h
* @brief Inline implementations of fast timers.
*
* $LicenseInfo:firstyear=2004&license=viewergpl$
*
* Copyright (c) 2004-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_FASTTIMER_H
#define LL_FASTTIMER_H
// pull in the actual class definition
#include "llfasttimer_class.h"
#if LL_WINDOWS
#define LL_INLINE __forceinline
//
// Windows implementation of CPU clock
//
//
// NOTE: put back in when we aren't using platform sdk anymore
//
// because MS has different signatures for these functions in winnt.h
// need to rename them to avoid conflicts
//#define _interlockedbittestandset _renamed_interlockedbittestandset
//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
//#include <intrin.h>
//#undef _interlockedbittestandset
//#undef _interlockedbittestandreset
//inline U32 get_cpu_clock_count_32()
//{
// U64 time_stamp = __rdtsc();
// return (U32)(time_stamp >> 8);
//}
//
//// return full timer value, *not* shifted by 8 bits
//inline U64 get_cpu_clock_count_64()
//{
// return __rdtsc();
//}
// shift off lower 8 bits for lower resolution but longer term timing
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
inline U32 get_cpu_clock_count_32()
{
U32 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
shr eax,8
shl edx,24
or eax, edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
// return full timer value, *not* shifted by 8 bits
inline U64 get_cpu_clock_count_64()
{
U64 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
mov eax,eax
mov edx,edx
mov dword ptr [ret_val+4], edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
#else
#define LL_INLINE
#endif
#if LL_LINUX || LL_SOLARIS
//
// Linux and Solaris implementation of CPU clock - all architectures.
//
// Try to use the MONOTONIC clock if available, this is a constant time counter
// with nanosecond resolution (but not necessarily accuracy) and attempts are made
// to synchronize this value between cores at kernel start. It should not be affected
// by CPU frequency. If not available use the REALTIME clock, but this may be affected by
// NTP adjustments or other user activity affecting the system time.
inline U64 get_cpu_clock_count_64()
{
struct timespec tp;
#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime, try REALTIME
#endif
clock_gettime(CLOCK_REALTIME,&tp);
return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
}
inline U32 get_cpu_clock_count_32()
{
return (U32)get_cpu_clock_count_64();
}
#endif // (LL_LINUX || LL_SOLARIS))
#if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
//
// Mac x86 implementation of CPU clock
inline U32 get_cpu_clock_count_32()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return (U32)x >> 8;
}
inline U32 get_cpu_clock_count_64()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return x >> 8;
}
#endif
#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)))
//
// Mac PPC (deprecated) implementation of CPU clock
//
// Just use gettimeofday implementation for now
inline U32 get_cpu_clock_count_32()
{
return (U32)get_clock_count();
}
inline U32 get_cpu_clock_count_64()
{
return get_clock_count();
}
#endif
#endif // LL_LLFASTTIMER_H
This diff is collapsed.
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
#define TIME_FAST_TIMERS 0 #define TIME_FAST_TIMERS 0
#if LL_WINDOWS
#define LL_INLINE __forceinline
#else
#define LL_INLINE
#endif // LL_WINDOWS
class LLMutex; class LLMutex;
#include <queue> #include <queue>
...@@ -47,7 +53,6 @@ class LLMutex; ...@@ -47,7 +53,6 @@ class LLMutex;
class LL_COMMON_API LLFastTimer class LL_COMMON_API LLFastTimer
{ {
public: public:
class NamedTimer; class NamedTimer;
struct LL_COMMON_API FrameState struct LL_COMMON_API FrameState
...@@ -163,11 +168,11 @@ class LL_COMMON_API LLFastTimer ...@@ -163,11 +168,11 @@ class LL_COMMON_API LLFastTimer
: mFrameState(timer.mFrameState) : mFrameState(timer.mFrameState)
{ {
#if TIME_FAST_TIMERS #if TIME_FAST_TIMERS
U64 timer_start = get_cpu_clock_count_64(); U64 timer_start = getCPUClockCount64();
#endif #endif
#if FAST_TIMER_ON #if FAST_TIMER_ON
LLFastTimer::FrameState* frame_state = mFrameState; LLFastTimer::FrameState* frame_state = mFrameState;
mStartTime = get_cpu_clock_count_32(); mStartTime = getCPUClockCount32();
frame_state->mActiveCount++; frame_state->mActiveCount++;
frame_state->mCalls++; frame_state->mCalls++;
...@@ -181,7 +186,7 @@ class LL_COMMON_API LLFastTimer ...@@ -181,7 +186,7 @@ class LL_COMMON_API LLFastTimer
cur_timer_data->mChildTime = 0; cur_timer_data->mChildTime = 0;
#endif #endif
#if TIME_FAST_TIMERS #if TIME_FAST_TIMERS
U64 timer_end = get_cpu_clock_count_64(); U64 timer_end = getCPUClockCount64();
sTimerCycles += timer_end - timer_start; sTimerCycles += timer_end - timer_start;
#endif #endif
} }
...@@ -189,11 +194,11 @@ class LL_COMMON_API LLFastTimer ...@@ -189,11 +194,11 @@ class LL_COMMON_API LLFastTimer
LL_INLINE ~LLFastTimer() LL_INLINE ~LLFastTimer()
{ {
#if TIME_FAST_TIMERS #if TIME_FAST_TIMERS
U64 timer_start = get_cpu_clock_count_64(); U64 timer_start = getCPUClockCount64();
#endif #endif
#if FAST_TIMER_ON #if FAST_TIMER_ON
LLFastTimer::FrameState* frame_state = mFrameState; LLFastTimer::FrameState* frame_state = mFrameState;
U32 total_time = get_cpu_clock_count_32() - mStartTime; U32 total_time = getCPUClockCount32() - mStartTime;
frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime; frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
frame_state->mActiveCount--; frame_state->mActiveCount--;
...@@ -208,7 +213,7 @@ class LL_COMMON_API LLFastTimer ...@@ -208,7 +213,7 @@ class LL_COMMON_API LLFastTimer
LLFastTimer::sCurTimerData = mLastTimerData; LLFastTimer::sCurTimerData = mLastTimerData;
#endif #endif
#if TIME_FAST_TIMERS #if TIME_FAST_TIMERS
U64 timer_end = get_cpu_clock_count_64(); U64 timer_end = getCPUClockCount64();
sTimerCycles += timer_end - timer_start; sTimerCycles += timer_end - timer_start;
sTimerCalls++; sTimerCalls++;
#endif #endif
...@@ -254,11 +259,14 @@ class LL_COMMON_API LLFastTimer ...@@ -254,11 +259,14 @@ class LL_COMMON_API LLFastTimer
static CurTimerData sCurTimerData; static CurTimerData sCurTimerData;
private: private:
static U32 getCPUClockCount32();
static U64 getCPUClockCount64();
static U64 sClockResolution;
static S32 sCurFrameIndex; static S32 sCurFrameIndex;
static S32 sLastFrameIndex; static S32 sLastFrameIndex;
static U64 sLastFrameTime; static U64 sLastFrameTime;
static info_list_t* sTimerInfos; static info_list_t* sTimerInfos;
static U64 sClockResolution;
U32 mStartTime; U32 mStartTime;
LLFastTimer::FrameState* mFrameState; LLFastTimer::FrameState* mFrameState;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment