From ae58e10c875214e2e020a72cbb7015e5adf118d7 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Tue, 21 Nov 2017 08:43:43 -0800 Subject: [PATCH] Add an inline helper to get a SharedFuture's state --- src/context.cpp | 20 ++++++++++---------- src/main.h | 5 ++++- src/source.cpp | 4 ++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/context.cpp b/src/context.cpp index 635640e..46967b7 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -896,7 +896,7 @@ Buffer ContextImpl::getBuffer(StringView name) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); @@ -935,7 +935,7 @@ SharedFuture ContextImpl::getBufferAsync(StringView name) if(iter != mFutureBuffers.end() && iter->mBuffer->getName() == name) { future = iter->mFuture; - if(future.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) + if(GetFutureState(future) == std::future_status::ready) mFutureBuffers.erase(iter); return future; } @@ -944,7 +944,7 @@ SharedFuture ContextImpl::getBufferAsync(StringView name) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -995,7 +995,7 @@ void ContextImpl::precacheBuffersAsync(ArrayView names) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -1066,7 +1066,7 @@ SharedFuture ContextImpl::createBufferAsyncFrom(StringView name, SharedP mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -1124,7 +1124,7 @@ Buffer ContextImpl::findBuffer(StringView name) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -1158,7 +1158,7 @@ SharedFuture ContextImpl::findBufferAsync(StringView name) if(iter != mFutureBuffers.end() && iter->mBuffer->getName() == name) { future = iter->mFuture; - if(future.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) + if(GetFutureState(future) == std::future_status::ready) mFutureBuffers.erase(iter); return future; } @@ -1167,7 +1167,7 @@ SharedFuture ContextImpl::findBufferAsync(StringView name) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -1214,7 +1214,7 @@ void ContextImpl::removeBuffer(StringView name) mFutureBuffers.erase( std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), [](const PendingBuffer &entry) -> bool - { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + { return GetFutureState(entry.mFuture) == std::future_status::ready; } ), mFutureBuffers.end() ); } @@ -1230,7 +1230,7 @@ void ContextImpl::removeBuffer(StringView name) std::remove_if(mPendingSources.begin(), mPendingSources.end(), [iter](PendingSource &entry) -> bool { - return (entry.mFuture.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready && + return (GetFutureState(entry.mFuture) == std::future_status::ready && entry.mFuture.get().getHandle() == iter->get()); } ), mPendingSources.end() diff --git a/src/main.h b/src/main.h index 81cf4b5..8d6ecb0 100644 --- a/src/main.h +++ b/src/main.h @@ -14,7 +14,6 @@ #define UNLIKELY(x) static_cast(x) #endif - #define DECL_THUNK0(ret, C, Name, cv) \ ret C::Name() cv { return pImpl->Name(); } #define DECL_THUNK1(ret, C, Name, cv, T1) \ @@ -49,6 +48,10 @@ ret C::Name(T1 a, T2 b, T3 c, T4 d, T5 e, T6 f) cv \ namespace alure { +template +inline std::future_status GetFutureState(const SharedFuture &future) +{ return future.wait_for(std::chrono::seconds::zero()); } + template struct Bitfield { private: diff --git a/src/source.cpp b/src/source.cpp index 0760d73..7091ed9 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -415,7 +415,7 @@ void SourceImpl::play(SharedFuture&& future_buffer) { if(!future_buffer.valid()) throw std::future_error(std::future_errc::no_state); - if(future_buffer.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) + if(GetFutureState(future_buffer) == std::future_status::ready) { play(future_buffer.get()); return; @@ -602,7 +602,7 @@ void SourceImpl::setGroup(SourceGroup group) bool SourceImpl::checkPending(SharedFuture &future) { - if(future.wait_for(std::chrono::milliseconds::zero()) != std::future_status::ready) + if(GetFutureState(future) != std::future_status::ready) return true; BufferImpl *buffer = future.get().getHandle(); -- 2.11.4.GIT