1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2025-02-14 12:35:36 +00:00

Fix KCondition variable; add timeout parameter to ILimitableResource

This commit is contained in:
TuxSH 2018-11-05 23:16:35 +01:00 committed by Michael Scire
parent 0a0c05481e
commit e2d8316401
4 changed files with 12 additions and 9 deletions

View file

@ -15,10 +15,12 @@ void ReleaseResource(const SharedPtr<KResourceLimit> &reslimit, KAutoObject::Typ
} }
template<typename Derived> template<typename Derived, uint maxResourceAcqWaitTimeMsec = 1000u>
class ILimitedResource { class ILimitedResource {
public: public:
static constexpr auto maxResourceAcqWaitTime = maxResourceAcqWaitTimeMsec * 1ms;
const SharedPtr<KProcess>& GetResourceOwner() const { return resourceOwner; } const SharedPtr<KProcess>& GetResourceOwner() const { return resourceOwner; }
void SetResourceOwner(SharedPtr<KProcess> owner) void SetResourceOwner(SharedPtr<KProcess> owner)
{ {

View file

@ -22,7 +22,7 @@ using ThreadMutexWaitListBaseHook = boost::intrusive::list_base_hook<boost::int
class KThread final : class KThread final :
public KAutoObject, public KAutoObject,
public ILimitedResource<KThread>, public ILimitedResource<KThread, 100u>,
public ISetAllocated<KThread>, public ISetAllocated<KThread>,
public IAlarmable, public IAlarmable,
public ThreadWaitListBaseHook, public ThreadWaitListBaseHook,

View file

@ -64,8 +64,6 @@ bool KResourceLimit::ReserveDetail(KResourceLimit::Category category, size_t cou
}; };
if (timeoutTime <= KSystemClock::never) { if (timeoutTime <= KSystemClock::never) {
// TODO, check is actually < 0
// TODO timeout
ok = true; ok = true;
condvar.wait(condition); condvar.wait(condition);
} else { } else {

View file

@ -8,16 +8,19 @@ namespace mesosphere
void KConditionVariable::wait_until_impl(const KSystemClock::time_point &timeoutPoint) noexcept void KConditionVariable::wait_until_impl(const KSystemClock::time_point &timeoutPoint) noexcept
{ {
// Official kernel counts number of waiters, but that isn't necessary // Official kernel counts number of waiters, but that isn't necessary
{ bool hasWaited = false;
KThread *currentThread = KCoreContext::GetCurrentInstance().GetCurrentThread(); KThread *currentThread = KCoreContext::GetCurrentInstance().GetCurrentThread();
{
KScopedCriticalSection criticalSection{}; KScopedCriticalSection criticalSection{};
mutex_.unlock(); mutex_.unlock();
if (currentThread->WaitForKernelSync(waiterList)) { if (currentThread->WaitForKernelSync(waiterList) && timeoutPoint > KSystemClock::time_point{}) {
(void)timeoutPoint; //TODO! hasWaited = true;
} else { currentThread->SetAlarmTime(timeoutPoint);
// Termination
} }
} }
if (hasWaited) {
currentThread->ClearAlarm();
}
mutex_.lock(); mutex_.lock();
} }