SL-16606: Add profiler category THREAD
parent
bf0643e28a
commit
b504c69255
|
|
@ -44,7 +44,7 @@ LLMutex::~LLMutex()
|
|||
|
||||
void LLMutex::lock()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if(isSelfLocked())
|
||||
{ //redundant lock
|
||||
mCount++;
|
||||
|
|
@ -66,7 +66,7 @@ void LLMutex::lock()
|
|||
|
||||
void LLMutex::unlock()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if (mCount > 0)
|
||||
{ //not the root unlock
|
||||
mCount--;
|
||||
|
|
@ -87,7 +87,7 @@ void LLMutex::unlock()
|
|||
|
||||
bool LLMutex::isLocked()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if (!mMutex.try_lock())
|
||||
{
|
||||
return true;
|
||||
|
|
@ -111,7 +111,7 @@ LLThread::id_t LLMutex::lockingThread() const
|
|||
|
||||
bool LLMutex::trylock()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if(isSelfLocked())
|
||||
{ //redundant lock
|
||||
mCount++;
|
||||
|
|
@ -150,20 +150,20 @@ LLCondition::~LLCondition()
|
|||
|
||||
void LLCondition::wait()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
std::unique_lock< std::mutex > lock(mMutex);
|
||||
mCond.wait(lock);
|
||||
}
|
||||
|
||||
void LLCondition::signal()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mCond.notify_one();
|
||||
}
|
||||
|
||||
void LLCondition::broadcast()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mCond.notify_all();
|
||||
}
|
||||
|
||||
|
|
@ -173,7 +173,7 @@ LLMutexTrylock::LLMutexTrylock(LLMutex* mutex)
|
|||
: mMutex(mutex),
|
||||
mLocked(false)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if (mMutex)
|
||||
mLocked = mMutex->trylock();
|
||||
}
|
||||
|
|
@ -182,7 +182,7 @@ LLMutexTrylock::LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms)
|
|||
: mMutex(mutex),
|
||||
mLocked(false)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if (!mMutex)
|
||||
return;
|
||||
|
||||
|
|
@ -197,7 +197,7 @@ LLMutexTrylock::LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms)
|
|||
|
||||
LLMutexTrylock::~LLMutexTrylock()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if (mMutex && mLocked)
|
||||
mMutex->unlock();
|
||||
}
|
||||
|
|
@ -209,7 +209,7 @@ LLMutexTrylock::~LLMutexTrylock()
|
|||
//
|
||||
LLScopedLock::LLScopedLock(std::mutex* mutex) : mMutex(mutex)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if(mutex)
|
||||
{
|
||||
mutex->lock();
|
||||
|
|
@ -228,7 +228,7 @@ LLScopedLock::~LLScopedLock()
|
|||
|
||||
void LLScopedLock::unlock()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if(mLocked)
|
||||
{
|
||||
mMutex->unlock();
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@ public:
|
|||
|
||||
static DERIVED_TYPE* getInstance()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// We know the viewer has LLSingleton dependency circularities. If you
|
||||
// feel strongly motivated to eliminate them, cheers and good luck.
|
||||
// (At that point we could consider a much simpler locking mechanism.)
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ bool LLThread::runCondition(void)
|
|||
// Stop thread execution if requested until unpaused.
|
||||
void LLThread::checkPause()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mDataLock->lock();
|
||||
|
||||
// This is in a while loop because the pthread API allows for spurious wakeups.
|
||||
|
|
@ -365,20 +365,20 @@ void LLThread::setQuitting()
|
|||
// static
|
||||
LLThread::id_t LLThread::currentID()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
return std::this_thread::get_id();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLThread::yield()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
std::this_thread::yield();
|
||||
}
|
||||
|
||||
void LLThread::wake()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mDataLock->lock();
|
||||
if(!shouldSleep())
|
||||
{
|
||||
|
|
@ -389,7 +389,7 @@ void LLThread::wake()
|
|||
|
||||
void LLThread::wakeLocked()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
if(!shouldSleep())
|
||||
{
|
||||
mRunCondition->signal();
|
||||
|
|
@ -398,13 +398,13 @@ void LLThread::wakeLocked()
|
|||
|
||||
void LLThread::lockData()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mDataLock->lock();
|
||||
}
|
||||
|
||||
void LLThread::unlockData()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD
|
||||
mDataLock->unlock();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -275,7 +275,7 @@ template <typename ElementT, typename QueueT>
|
|||
template <typename CALLABLE>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::tryLock(CALLABLE&& callable)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock1(mLock, std::defer_lock);
|
||||
if (!lock1.try_lock())
|
||||
return false;
|
||||
|
|
@ -292,7 +292,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::tryLockUntil(
|
|||
const std::chrono::time_point<Clock, Duration>& until,
|
||||
CALLABLE&& callable)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock1(mLock, std::defer_lock);
|
||||
if (!lock1.try_lock_until(until))
|
||||
return false;
|
||||
|
|
@ -306,7 +306,7 @@ template <typename ElementT, typename QueueT>
|
|||
template <typename T>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::push_(lock_t& lock, T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
if (mStorage.size() >= mCapacity)
|
||||
return false;
|
||||
|
||||
|
|
@ -322,7 +322,7 @@ template <typename ElementT, typename QueueT>
|
|||
template <typename T>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::pushIfOpen(T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock1(mLock);
|
||||
while (true)
|
||||
{
|
||||
|
|
@ -345,7 +345,7 @@ template <typename ElementT, typename QueueT>
|
|||
template<typename T>
|
||||
void LLThreadSafeQueue<ElementT, QueueT>::push(T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
if (! pushIfOpen(std::forward<T>(element)))
|
||||
{
|
||||
LLTHROW(LLThreadSafeQueueInterrupt());
|
||||
|
|
@ -357,7 +357,7 @@ template<typename ElementT, typename QueueT>
|
|||
template<typename T>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::tryPush(T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryLock(
|
||||
[this, element=std::move(element)](lock_t& lock)
|
||||
{
|
||||
|
|
@ -374,7 +374,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::tryPushFor(
|
|||
const std::chrono::duration<Rep, Period>& timeout,
|
||||
T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// Convert duration to time_point: passing the same timeout duration to
|
||||
// each of multiple calls is wrong.
|
||||
return tryPushUntil(std::chrono::steady_clock::now() + timeout,
|
||||
|
|
@ -388,7 +388,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::tryPushUntil(
|
|||
const std::chrono::time_point<Clock, Duration>& until,
|
||||
T&& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryLockUntil(
|
||||
until,
|
||||
[this, until, element=std::move(element)](lock_t& lock)
|
||||
|
|
@ -421,7 +421,7 @@ template <typename ElementT, typename QueueT>
|
|||
typename LLThreadSafeQueue<ElementT, QueueT>::pop_result
|
||||
LLThreadSafeQueue<ElementT, QueueT>::pop_(lock_t& lock, ElementT& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// If mStorage is empty, there's no head element.
|
||||
if (mStorage.empty())
|
||||
return mClosed? DONE : EMPTY;
|
||||
|
|
@ -443,7 +443,7 @@ LLThreadSafeQueue<ElementT, QueueT>::pop_(lock_t& lock, ElementT& element)
|
|||
template<typename ElementT, typename QueueT>
|
||||
ElementT LLThreadSafeQueue<ElementT, QueueT>::pop(void)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock1(mLock);
|
||||
ElementT value;
|
||||
while (true)
|
||||
|
|
@ -472,7 +472,7 @@ ElementT LLThreadSafeQueue<ElementT, QueueT>::pop(void)
|
|||
template<typename ElementT, typename QueueT>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::tryPop(ElementT & element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryLock(
|
||||
[this, &element](lock_t& lock)
|
||||
{
|
||||
|
|
@ -490,7 +490,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::tryPopFor(
|
|||
const std::chrono::duration<Rep, Period>& timeout,
|
||||
ElementT& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// Convert duration to time_point: passing the same timeout duration to
|
||||
// each of multiple calls is wrong.
|
||||
return tryPopUntil(std::chrono::steady_clock::now() + timeout, element);
|
||||
|
|
@ -503,7 +503,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::tryPopUntil(
|
|||
const std::chrono::time_point<Clock, Duration>& until,
|
||||
ElementT& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryLockUntil(
|
||||
until,
|
||||
[this, until, &element](lock_t& lock)
|
||||
|
|
@ -523,7 +523,7 @@ LLThreadSafeQueue<ElementT, QueueT>::tryPopUntil_(
|
|||
const std::chrono::time_point<Clock, Duration>& until,
|
||||
ElementT& element)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
while (true)
|
||||
{
|
||||
pop_result popped = pop_(lock, element);
|
||||
|
|
@ -550,7 +550,7 @@ LLThreadSafeQueue<ElementT, QueueT>::tryPopUntil_(
|
|||
template<typename ElementT, typename QueueT>
|
||||
size_t LLThreadSafeQueue<ElementT, QueueT>::size(void)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock(mLock);
|
||||
return mStorage.size();
|
||||
}
|
||||
|
|
@ -559,7 +559,7 @@ size_t LLThreadSafeQueue<ElementT, QueueT>::size(void)
|
|||
template<typename ElementT, typename QueueT>
|
||||
void LLThreadSafeQueue<ElementT, QueueT>::close()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock(mLock);
|
||||
mClosed = true;
|
||||
lock.unlock();
|
||||
|
|
@ -573,7 +573,7 @@ void LLThreadSafeQueue<ElementT, QueueT>::close()
|
|||
template<typename ElementT, typename QueueT>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::isClosed()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock(mLock);
|
||||
return mClosed;
|
||||
}
|
||||
|
|
@ -582,7 +582,7 @@ bool LLThreadSafeQueue<ElementT, QueueT>::isClosed()
|
|||
template<typename ElementT, typename QueueT>
|
||||
bool LLThreadSafeQueue<ElementT, QueueT>::done()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock(mLock);
|
||||
return mClosed && mStorage.empty();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,14 +98,14 @@ namespace LL
|
|||
// we could minimize redundancy by breaking out a common base class...
|
||||
void push(const DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
push(tuple_cons(Clock::now(), tuple));
|
||||
}
|
||||
|
||||
/// individually pass each component of the TimeTuple
|
||||
void push(const TimePoint& time, Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
push(TimeTuple(time, std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
|
|
@ -116,7 +116,7 @@ namespace LL
|
|||
// and call that overload.
|
||||
void push(Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
push(Clock::now(), std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
|
|
@ -127,21 +127,21 @@ namespace LL
|
|||
/// DataTuple with implicit now
|
||||
bool tryPush(const DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPush(tuple_cons(Clock::now(), tuple));
|
||||
}
|
||||
|
||||
/// individually pass components
|
||||
bool tryPush(const TimePoint& time, Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPush(TimeTuple(time, std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
/// individually pass components with implicit now
|
||||
bool tryPush(Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPush(Clock::now(), std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
|
|
@ -154,7 +154,7 @@ namespace LL
|
|||
bool tryPushFor(const std::chrono::duration<Rep, Period>& timeout,
|
||||
const DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushFor(timeout, tuple_cons(Clock::now(), tuple));
|
||||
}
|
||||
|
||||
|
|
@ -163,7 +163,7 @@ namespace LL
|
|||
bool tryPushFor(const std::chrono::duration<Rep, Period>& timeout,
|
||||
const TimePoint& time, Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushFor(TimeTuple(time, std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +172,7 @@ namespace LL
|
|||
bool tryPushFor(const std::chrono::duration<Rep, Period>& timeout,
|
||||
Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushFor(Clock::now(), std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
|
|
@ -185,7 +185,7 @@ namespace LL
|
|||
bool tryPushUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
const DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushUntil(until, tuple_cons(Clock::now(), tuple));
|
||||
}
|
||||
|
||||
|
|
@ -194,7 +194,7 @@ namespace LL
|
|||
bool tryPushUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
const TimePoint& time, Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushUntil(until, TimeTuple(time, std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
|
|
@ -203,7 +203,7 @@ namespace LL
|
|||
bool tryPushUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
Args&&... args)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tryPushUntil(until, Clock::now(), std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
|
|
@ -221,14 +221,14 @@ namespace LL
|
|||
// haven't yet jumped through those hoops.
|
||||
DataTuple pop()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
return tuple_cdr(popWithTime());
|
||||
}
|
||||
|
||||
/// pop TimeTuple by value
|
||||
TimeTuple popWithTime()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
lock_t lock(super::mLock);
|
||||
// We can't just sit around waiting forever, given that there may
|
||||
// be items in the queue that are not yet ready but will *become*
|
||||
|
|
@ -268,7 +268,7 @@ namespace LL
|
|||
/// tryPop(DataTuple&)
|
||||
bool tryPop(DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
TimeTuple tt;
|
||||
if (! super::tryPop(tt))
|
||||
return false;
|
||||
|
|
@ -279,7 +279,7 @@ namespace LL
|
|||
/// for when Args has exactly one type
|
||||
bool tryPop(typename std::tuple_element<1, TimeTuple>::type& value)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
TimeTuple tt;
|
||||
if (! super::tryPop(tt))
|
||||
return false;
|
||||
|
|
@ -291,7 +291,7 @@ namespace LL
|
|||
template <typename Rep, typename Period, typename Tuple>
|
||||
bool tryPopFor(const std::chrono::duration<Rep, Period>& timeout, Tuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// It's important to use OUR tryPopUntil() implementation, rather
|
||||
// than delegating immediately to our base class.
|
||||
return tryPopUntil(Clock::now() + timeout, tuple);
|
||||
|
|
@ -302,7 +302,7 @@ namespace LL
|
|||
bool tryPopUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
TimeTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// super::tryPopUntil() wakes up when an item becomes available or
|
||||
// we hit 'until', whichever comes first. Thing is, the current
|
||||
// head of the queue could become ready sooner than either of
|
||||
|
|
@ -322,7 +322,7 @@ namespace LL
|
|||
|
||||
pop_result tryPopUntil_(lock_t& lock, const TimePoint& until, TimeTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
TimePoint adjusted = until;
|
||||
if (! super::mStorage.empty())
|
||||
{
|
||||
|
|
@ -350,7 +350,7 @@ namespace LL
|
|||
bool tryPopUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
DataTuple& tuple)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
TimeTuple tt;
|
||||
if (! tryPopUntil(until, tt))
|
||||
return false;
|
||||
|
|
@ -363,7 +363,7 @@ namespace LL
|
|||
bool tryPopUntil(const std::chrono::time_point<Clock, Duration>& until,
|
||||
typename std::tuple_element<1, TimeTuple>::type& value)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
TimeTuple tt;
|
||||
if (! tryPopUntil(until, tt))
|
||||
return false;
|
||||
|
|
@ -387,7 +387,7 @@ namespace LL
|
|||
// considering whether to deliver the current head element
|
||||
bool canPop(const TimeTuple& head) const override
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// an item with a future timestamp isn't yet ready to pop
|
||||
// (should we add some slop for overhead?)
|
||||
return std::get<0>(head) <= Clock::now();
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ void LL::WorkQueue::runUntilClose()
|
|||
{
|
||||
for (;;)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
callWork(mQueue.pop());
|
||||
}
|
||||
}
|
||||
|
|
@ -71,7 +71,7 @@ void LL::WorkQueue::runUntilClose()
|
|||
|
||||
bool LL::WorkQueue::runPending()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
for (Work work; mQueue.tryPop(work); )
|
||||
{
|
||||
callWork(work);
|
||||
|
|
@ -91,7 +91,7 @@ bool LL::WorkQueue::runOne()
|
|||
|
||||
bool LL::WorkQueue::runUntil(const TimePoint& until)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
// Should we subtract some slop to allow for typical Work execution time?
|
||||
// How much slop?
|
||||
// runUntil() is simply a time-bounded runPending().
|
||||
|
|
@ -129,7 +129,7 @@ void LL::WorkQueue::callWork(const Queue::DataTuple& work)
|
|||
|
||||
void LL::WorkQueue::callWork(const Work& work)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
try
|
||||
{
|
||||
work();
|
||||
|
|
|
|||
Loading…
Reference in New Issue