CmResourceHandle.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "CmPrerequisites.h"
  2. #include "CmResourceHandle.h"
  3. #include "CmResource.h"
  4. #include "CmResourceHandleRTTI.h"
  5. #include "CmResources.h"
  6. namespace CamelotFramework
  7. {
  8. CM_STATIC_THREAD_SYNCHRONISER_CLASS_INSTANCE(mResourceCreatedCondition, ResourceHandleBase)
  9. CM_STATIC_MUTEX_CLASS_INSTANCE(mResourceCreatedMutex, ResourceHandleBase)
  10. ResourceHandleBase::ResourceHandleBase()
  11. {
  12. mData = nullptr;
  13. }
  14. bool ResourceHandleBase::isLoaded() const
  15. {
  16. return (mData != nullptr && mData->mIsCreated && mData->mPtr != nullptr);
  17. }
  18. void ResourceHandleBase::synchronize() const
  19. {
  20. if(mData == nullptr)
  21. return;
  22. if(!mData->mIsCreated)
  23. {
  24. CM_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
  25. while(!mData->mIsCreated)
  26. {
  27. CM_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
  28. }
  29. }
  30. mData->mPtr->synchonize();
  31. }
  32. void ResourceHandleBase::setResourcePtr(std::shared_ptr<Resource> ptr)
  33. {
  34. mData->mPtr = ptr;
  35. if(mData->mPtr)
  36. {
  37. mData->mUUID = mData->mPtr->getUUID();
  38. if(!mData->mIsCreated)
  39. {
  40. CM_LOCK_MUTEX(mResourceCreatedMutex);
  41. {
  42. mData->mIsCreated = true;
  43. }
  44. CM_THREAD_NOTIFY_ALL(mResourceCreatedCondition);
  45. }
  46. }
  47. }
  48. void ResourceHandleBase::throwIfNotLoaded() const
  49. {
  50. if(!isLoaded())
  51. {
  52. CM_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  53. }
  54. }
  55. RTTITypeBase* ResourceHandleBase::getRTTIStatic()
  56. {
  57. return ResourceHandleRTTI::instance();
  58. }
  59. RTTITypeBase* ResourceHandleBase::getRTTI() const
  60. {
  61. return ResourceHandleBase::getRTTIStatic();
  62. }
  63. }