Merge git://github.com/AlericInglewood/SingularityViewer
This commit is contained in:
@@ -29,33 +29,22 @@
|
|||||||
* COMPLETENESS OR PERFORMANCE.
|
* COMPLETENESS OR PERFORMANCE.
|
||||||
* $/LicenseInfo$
|
* $/LicenseInfo$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "linden_common.h"
|
#include "linden_common.h"
|
||||||
|
|
||||||
#include "llfasttimer.h"
|
#include "llfasttimer.h"
|
||||||
|
|
||||||
#include "llmemory.h"
|
#include "llmemory.h"
|
||||||
#include "llprocessor.h"
|
#include "llprocessor.h"
|
||||||
|
|
||||||
|
|
||||||
#if LL_WINDOWS
|
#if LL_WINDOWS
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "lltimer.h"
|
|
||||||
#elif LL_LINUX || LL_SOLARIS
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sched.h>
|
|
||||||
#include "lltimer.h"
|
|
||||||
#elif LL_DARWIN
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include "lltimer.h" // get_clock_count()
|
|
||||||
#else
|
|
||||||
#error "architecture not supported"
|
|
||||||
#endif
|
#endif
|
||||||
|
#include "lltimer.h"
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// statics
|
// statics
|
||||||
|
|
||||||
|
|
||||||
LLFastTimer::EFastTimerType LLFastTimer::sCurType = LLFastTimer::FTM_OTHER;
|
LLFastTimer::EFastTimerType LLFastTimer::sCurType = LLFastTimer::FTM_OTHER;
|
||||||
int LLFastTimer::sCurDepth = 0;
|
int LLFastTimer::sCurDepth = 0;
|
||||||
U64 LLFastTimer::sStart[LLFastTimer::FTM_MAX_DEPTH];
|
U64 LLFastTimer::sStart[LLFastTimer::FTM_MAX_DEPTH];
|
||||||
@@ -70,44 +59,12 @@ S32 LLFastTimer::sLastFrameIndex = -1;
|
|||||||
int LLFastTimer::sPauseHistory = 0;
|
int LLFastTimer::sPauseHistory = 0;
|
||||||
int LLFastTimer::sResetHistory = 0;
|
int LLFastTimer::sResetHistory = 0;
|
||||||
|
|
||||||
#define USE_RDTSC 0
|
U64 LLFastTimer::sClockResolution = calc_clock_frequency(50U); // Resolution of get_clock_count()
|
||||||
|
|
||||||
#if LL_LINUX || LL_SOLARIS
|
|
||||||
U64 LLFastTimer::sClockResolution = 1000000000; // 1e9, Nanosecond resolution
|
|
||||||
#else
|
|
||||||
U64 LLFastTimer::sClockResolution = 1000000; // 1e6, Microsecond resolution
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//static
|
|
||||||
#if (LL_DARWIN || LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
|
|
||||||
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
|
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
|
||||||
{
|
{
|
||||||
return sClockResolution >> 8;
|
return sClockResolution >> 8;
|
||||||
}
|
}
|
||||||
#else // windows or x86-mac or x86-linux or x86-solaris
|
|
||||||
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
|
|
||||||
{
|
|
||||||
#if USE_RDTSC || !LL_WINDOWS
|
|
||||||
//getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
|
|
||||||
static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
|
|
||||||
|
|
||||||
// we drop the low-order byte in our timers, so report a lower frequency
|
|
||||||
#else
|
|
||||||
// If we're not using RDTSC, each fasttimer tick is just a performance counter tick.
|
|
||||||
// Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency())
|
|
||||||
// since that would change displayed MHz stats for CPUs
|
|
||||||
static bool firstcall = true;
|
|
||||||
static U64 sCPUClockFrequency;
|
|
||||||
if (firstcall)
|
|
||||||
{
|
|
||||||
QueryPerformanceFrequency((LARGE_INTEGER*)&sCPUClockFrequency);
|
|
||||||
firstcall = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return sCPUClockFrequency >> 8;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void LLFastTimer::reset()
|
void LLFastTimer::reset()
|
||||||
{
|
{
|
||||||
@@ -162,139 +119,17 @@ void LLFastTimer::reset()
|
|||||||
// Important note: These implementations must be FAST!
|
// Important note: These implementations must be FAST!
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
#if LL_WINDOWS
|
|
||||||
//
|
|
||||||
// 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 LLFastTimer::getCPUClockCount32()
|
|
||||||
//{
|
|
||||||
// U64 time_stamp = __rdtsc();
|
|
||||||
// return (U32)(time_stamp >> 8);
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// return full timer value, *not* shifted by 8 bits
|
|
||||||
//inline U64 LLFastTimer::getCPUClockCount64()
|
|
||||||
//{
|
|
||||||
// return __rdtsc();
|
|
||||||
//}
|
|
||||||
|
|
||||||
// shift off lower 8 bits for lower resolution but longer term timing
|
// 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
|
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
|
||||||
#if USE_RDTSC
|
|
||||||
U32 LLFastTimer::getCPUClockCount32()
|
|
||||||
{
|
|
||||||
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
|
|
||||||
U64 LLFastTimer::getCPUClockCount64()
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LLFastTimer::sClockType = "rdtsc";
|
|
||||||
|
|
||||||
#else
|
|
||||||
//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
|
//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
|
||||||
// These use QueryPerformanceCounter, which is arguably fine and also works on amd architectures.
|
// On windows these use QueryPerformanceCounter, which is arguably fine and also works on amd architectures.
|
||||||
U32 LLFastTimer::getCPUClockCount32()
|
U32 LLFastTimer::getCPUClockCount32()
|
||||||
{
|
{
|
||||||
return (U32)(get_clock_count()>>8);
|
return get_clock_count() >> 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
U64 LLFastTimer::getCPUClockCount64()
|
U64 LLFastTimer::getCPUClockCount64()
|
||||||
{
|
{
|
||||||
return get_clock_count();
|
return get_clock_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LLFastTimer::sClockType = "QueryPerformanceCounter";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
|
|
||||||
//
|
|
||||||
// Linux and Solaris implementation of CPU clock - non-x86.
|
|
||||||
// This is accurate but SLOW! Only use out of desperation.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
U64 LLFastTimer::getCPUClockCount64()
|
|
||||||
{
|
|
||||||
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 then ouch, try REALTIME
|
|
||||||
#endif
|
|
||||||
clock_gettime(CLOCK_REALTIME,&tp);
|
|
||||||
|
|
||||||
return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
|
|
||||||
}
|
|
||||||
|
|
||||||
U32 LLFastTimer::getCPUClockCount32()
|
|
||||||
{
|
|
||||||
return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LLFastTimer::sClockType = "clock_gettime";
|
|
||||||
|
|
||||||
#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
|
|
||||||
|
|
||||||
|
|
||||||
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
|
|
||||||
//
|
|
||||||
// Mac+Linux+Solaris FAST x86 implementation of CPU clock
|
|
||||||
U32 LLFastTimer::getCPUClockCount32()
|
|
||||||
{
|
|
||||||
U64 x;
|
|
||||||
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
|
|
||||||
return (U32)(x >> 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
U64 LLFastTimer::getCPUClockCount64()
|
|
||||||
{
|
|
||||||
U64 x;
|
|
||||||
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LLFastTimer::sClockType = "rdtsc";
|
|
||||||
#endif
|
|
||||||
@@ -256,7 +256,6 @@ public:
|
|||||||
static void reset();
|
static void reset();
|
||||||
static U64 countsPerSecond();
|
static U64 countsPerSecond();
|
||||||
|
|
||||||
static std::string sClockType;
|
|
||||||
public:
|
public:
|
||||||
static int sCurDepth;
|
static int sCurDepth;
|
||||||
static U64 sStart[FTM_MAX_DEPTH];
|
static U64 sStart[FTM_MAX_DEPTH];
|
||||||
|
|||||||
@@ -142,9 +142,6 @@ std::string glob_to_regex(const std::string& glob)
|
|||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case '.':
|
|
||||||
regex+="\\.";
|
|
||||||
break;
|
|
||||||
case '*':
|
case '*':
|
||||||
if (glob.begin() == i)
|
if (glob.begin() == i)
|
||||||
{
|
{
|
||||||
@@ -177,6 +174,14 @@ std::string glob_to_regex(const std::string& glob)
|
|||||||
case '!':
|
case '!':
|
||||||
regex+= square_brace_open ? '^' : c;
|
regex+= square_brace_open ? '^' : c;
|
||||||
break;
|
break;
|
||||||
|
case '.': // This collection have different regex meaning
|
||||||
|
case '^': // And so need escaping
|
||||||
|
case '(':
|
||||||
|
case ')':
|
||||||
|
case '+':
|
||||||
|
case '|':
|
||||||
|
case '$':
|
||||||
|
regex+='\\';
|
||||||
default:
|
default:
|
||||||
regex+=c;
|
regex+=c;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)
|
|||||||
|
|
||||||
std::string LLLogChat::cleanFileName(std::string filename)
|
std::string LLLogChat::cleanFileName(std::string filename)
|
||||||
{
|
{
|
||||||
std::string invalidChars = "\"\'\\/?*:<>|";
|
std::string invalidChars = "\"\'\\/?*:<>|[]{}~"; // Cannot match glob or illegal filename chars
|
||||||
S32 position = filename.find_first_of(invalidChars);
|
S32 position = filename.find_first_of(invalidChars);
|
||||||
while (position != filename.npos)
|
while (position != filename.npos)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ void LLPreviewAnim::gotAssetForSave(LLVFS *vfs,
|
|||||||
// static
|
// static
|
||||||
void LLPreviewAnim::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker)
|
void LLPreviewAnim::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker)
|
||||||
{
|
{
|
||||||
if (!filepicker->hasFilename())
|
if (filepicker->hasFilename())
|
||||||
{
|
{
|
||||||
std::string filename = filepicker->getFilename();
|
std::string filename = filepicker->getFilename();
|
||||||
std::ofstream export_file(filename.c_str(), std::ofstream::binary);
|
std::ofstream export_file(filename.c_str(), std::ofstream::binary);
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ LLToolBar::LLToolBar()
|
|||||||
BOOL LLToolBar::postBuild()
|
BOOL LLToolBar::postBuild()
|
||||||
{
|
{
|
||||||
childSetCommitCallback("communicate_btn", onClickCommunicate, this);
|
childSetCommitCallback("communicate_btn", onClickCommunicate, this);
|
||||||
childSetControlName("communicate_btn", "ShowCommunicate");
|
|
||||||
|
|
||||||
childSetAction("chat_btn", onClickChat, this);
|
childSetAction("chat_btn", onClickChat, this);
|
||||||
childSetControlName("chat_btn", "ChatVisible");
|
childSetControlName("chat_btn", "ChatVisible");
|
||||||
|
|||||||
@@ -154,16 +154,13 @@ std::string build_extensions_string(ELoadFilter filter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AIFileUpload {
|
class AIFileUpload {
|
||||||
protected:
|
|
||||||
AIFilePicker* mPicker;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AIFileUpload(void) : mPicker(NULL) { }
|
AIFileUpload(void) { }
|
||||||
virtual ~AIFileUpload() { llassert(!mPicker); if (mPicker) { mPicker->abort(); mPicker = NULL; } }
|
virtual ~AIFileUpload() { }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool is_valid(std::string const& filename, ELoadFilter type);
|
bool is_valid(std::string const& filename, ELoadFilter type);
|
||||||
void filepicker_callback(ELoadFilter type);
|
void filepicker_callback(ELoadFilter type, AIFilePicker* picker);
|
||||||
void start_filepicker(ELoadFilter type, char const* context);
|
void start_filepicker(ELoadFilter type, char const* context);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -179,21 +176,22 @@ void AIFileUpload::start_filepicker(ELoadFilter filter, char const* context)
|
|||||||
// display();
|
// display();
|
||||||
}
|
}
|
||||||
|
|
||||||
llassert(!mPicker);
|
AIFilePicker* picker = AIFilePicker::create();
|
||||||
mPicker = AIFilePicker::create();
|
picker->open(filter, "", context);
|
||||||
mPicker->open(filter, "", context);
|
// Note that when the call back is called then we're still in the main loop of
|
||||||
mPicker->run(boost::bind(&AIFileUpload::filepicker_callback, this, filter));
|
// the viewer and therefore the AIFileUpload still exists, since that is only
|
||||||
|
// destructed at the end of main when exiting the viewer.
|
||||||
|
picker->run(boost::bind(&AIFileUpload::filepicker_callback, this, filter, picker));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIFileUpload::filepicker_callback(ELoadFilter type)
|
void AIFileUpload::filepicker_callback(ELoadFilter type, AIFilePicker* picker)
|
||||||
{
|
{
|
||||||
if (mPicker->hasFilename())
|
if (picker->hasFilename())
|
||||||
{
|
{
|
||||||
std::string filename = mPicker->getFilename();
|
std::string filename = picker->getFilename();
|
||||||
if (is_valid(filename, type))
|
if (is_valid(filename, type))
|
||||||
handle_event(filename);
|
handle_event(filename);
|
||||||
}
|
}
|
||||||
mPicker = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AIFileUpload::is_valid(std::string const& filename, ELoadFilter type)
|
bool AIFileUpload::is_valid(std::string const& filename, ELoadFilter type)
|
||||||
@@ -478,7 +476,7 @@ class LLFileMinimizeAllWindows : public view_listener_t
|
|||||||
};
|
};
|
||||||
// </edit>
|
// </edit>
|
||||||
|
|
||||||
class LLFileSaveTexture : public view_listener_t
|
class LLFileSavePreview : public view_listener_t
|
||||||
{
|
{
|
||||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||||
{
|
{
|
||||||
@@ -1268,12 +1266,11 @@ void init_menu_file()
|
|||||||
// <edit>
|
// <edit>
|
||||||
(new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows");
|
(new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows");
|
||||||
// </edit>
|
// </edit>
|
||||||
(new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture");
|
(new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview");
|
||||||
(new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
|
(new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
|
||||||
(new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
|
(new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
|
||||||
(new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
|
(new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
|
||||||
(new LLFileLogOut())->registerListener(gMenuHolder, "File.LogOut");
|
(new LLFileLogOut())->registerListener(gMenuHolder, "File.LogOut");
|
||||||
//Emerald has a second llFileSaveTexture here... Same as the original. Odd. -HgB
|
|
||||||
(new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
|
(new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
|
||||||
(new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs");
|
(new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,9 +52,9 @@
|
|||||||
</menu_item_call>
|
</menu_item_call>
|
||||||
<menu_item_separator bottom="-121" enabled="true" height="8" label="-----------" left="0"
|
<menu_item_separator bottom="-121" enabled="true" height="8" label="-----------" left="0"
|
||||||
mouse_opaque="true" name="separator2" width="243" />
|
mouse_opaque="true" name="separator2" width="243" />
|
||||||
<menu_item_call bottom="-140" enabled="true" height="19" label="Save Texture As..." left="0"
|
<menu_item_call bottom="-140" enabled="true" height="19" label="Save Preview As..." left="0"
|
||||||
mouse_opaque="true" name="Save Texture As..." width="243">
|
mouse_opaque="true" name="Save Preview As..." width="243">
|
||||||
<on_click function="File.SaveTexture" userdata="" />
|
<on_click function="File.SavePreview" userdata="" />
|
||||||
<on_enable function="File.EnableSaveAs" />
|
<on_enable function="File.EnableSaveAs" />
|
||||||
</menu_item_call>
|
</menu_item_call>
|
||||||
<menu_item_separator bottom="-148" enabled="true" height="8" label="-----------" left="0"
|
<menu_item_separator bottom="-148" enabled="true" height="8" label="-----------" left="0"
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ AITHREADSAFESIMPLE(U64, AIStateMachine::sMaxCount, );
|
|||||||
void AIStateMachine::updateSettings(void)
|
void AIStateMachine::updateSettings(void)
|
||||||
{
|
{
|
||||||
Dout(dc::statemachine, "Initializing AIStateMachine::sMaxCount");
|
Dout(dc::statemachine, "Initializing AIStateMachine::sMaxCount");
|
||||||
*AIAccess<U64>(sMaxCount) = LLFastTimer::countsPerSecond() * gSavedSettings.getU32("StateMachineMaxTime") / 1000;
|
*AIAccess<U64>(sMaxCount) = LLFastTimer::sClockResolution * gSavedSettings.getU32("StateMachineMaxTime") / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@@ -319,7 +319,7 @@ void AIStateMachine::mainloop(void*)
|
|||||||
if (total_clocks >= max_count)
|
if (total_clocks >= max_count)
|
||||||
{
|
{
|
||||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||||
llwarns << "AIStateMachine::mainloop did run for " << (total_clocks * 1000 / LLFastTimer::countsPerSecond()) << " ms." << llendl;
|
llwarns << "AIStateMachine::mainloop did run for " << (total_clocks * 1000 / LLFastTimer::sClockResolution) << " ms." << llendl;
|
||||||
#endif
|
#endif
|
||||||
std::sort(active_statemachines.begin(), active_statemachines.end(), QueueElementComp());
|
std::sort(active_statemachines.begin(), active_statemachines.end(), QueueElementComp());
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user