BsAsyncOp.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsAsyncOp.h"
  4. #include "BsDebug.h"
  5. namespace BansheeEngine
  6. {
  7. bool AsyncOp::hasCompleted() const
  8. {
  9. return mData->mIsCompleted.load(std::memory_order_acquire);
  10. }
  11. void AsyncOp::_completeOperation(Any returnValue)
  12. {
  13. mData->mReturnValue = returnValue;
  14. mData->mIsCompleted.store(true, std::memory_order_release);
  15. if (mSyncData != nullptr)
  16. mSyncData->mCondition.notify_all();
  17. }
  18. void AsyncOp::_completeOperation()
  19. {
  20. mData->mIsCompleted.store(true, std::memory_order_release);
  21. if (mSyncData != nullptr)
  22. mSyncData->mCondition.notify_all();
  23. }
  24. void AsyncOp::blockUntilComplete() const
  25. {
  26. if (mSyncData == nullptr)
  27. {
  28. LOGERR("No sync data is available. Cannot block until AsyncOp is complete.");
  29. return;
  30. }
  31. Lock lock(mSyncData->mMutex);
  32. while (!hasCompleted())
  33. mSyncData->mCondition.wait(lock);
  34. }
  35. }