BsAsyncOp.cpp 1.2 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. BS_THREAD_NOTIFY_ALL(mSyncData->mCondition);
  17. }
  18. void AsyncOp::_completeOperation()
  19. {
  20. mData->mIsCompleted.store(true, std::memory_order_release);
  21. if (mSyncData != nullptr)
  22. BS_THREAD_NOTIFY_ALL(mSyncData->mCondition);
  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. BS_LOCK_MUTEX_NAMED(mSyncData->mMutex, lock);
  32. while (!hasCompleted())
  33. BS_THREAD_WAIT(mSyncData->mCondition, mSyncData->mMutex, lock);
  34. }
  35. }