resource_loader.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "resource_loader.h"
  6. #include "memory.h"
  7. #include "resource_registry.h"
  8. #include "queue.h"
  9. #include "filesystem.h"
  10. #include "temp_allocator.h"
  11. #include "path.h"
  12. namespace crown
  13. {
  14. ResourceLoader::ResourceLoader(Filesystem& fs, Allocator& resource_heap)
  15. : _fs(fs)
  16. , _resource_heap(resource_heap)
  17. , _requests(default_allocator())
  18. , _loaded(default_allocator())
  19. , _exit(false)
  20. {
  21. _thread.start(ResourceLoader::thread_proc, this);
  22. }
  23. ResourceLoader::~ResourceLoader()
  24. {
  25. _exit = true;
  26. _thread.stop();
  27. }
  28. void ResourceLoader::load(ResourceId id)
  29. {
  30. add_request(id);
  31. }
  32. void ResourceLoader::flush()
  33. {
  34. while (num_requests()) {}
  35. }
  36. void ResourceLoader::add_request(ResourceId id)
  37. {
  38. ScopedMutex sm(_mutex);
  39. queue::push_back(_requests, id);
  40. }
  41. uint32_t ResourceLoader::num_requests()
  42. {
  43. ScopedMutex sm(_mutex);
  44. return queue::size(_requests);
  45. }
  46. void ResourceLoader::add_loaded(ResourceData data)
  47. {
  48. ScopedMutex sm(_loaded_mutex);
  49. queue::push_back(_loaded, data);
  50. }
  51. void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
  52. {
  53. ScopedMutex sm(_loaded_mutex);
  54. uint32_t num = queue::size(_loaded);
  55. for (uint32_t i = 0; i < num; i++)
  56. {
  57. array::push_back(loaded, queue::front(_loaded));
  58. queue::pop_front(_loaded);
  59. }
  60. }
  61. int32_t ResourceLoader::run()
  62. {
  63. while (!_exit)
  64. {
  65. _mutex.lock();
  66. if (queue::empty(_requests))
  67. {
  68. _mutex.unlock();
  69. continue;
  70. }
  71. ResourceId id = queue::front(_requests);
  72. _mutex.unlock();
  73. ResourceData rd;
  74. rd.id = id;
  75. char name[64];
  76. id.to_string(name);
  77. TempAllocator256 alloc;
  78. DynamicString path(alloc);
  79. path::join(CROWN_DATA_DIRECTORY, name, path);
  80. File* file = _fs.open(path.c_str(), FOM_READ);
  81. rd.data = resource_on_load(id.type, *file, _resource_heap);
  82. _fs.close(file);
  83. add_loaded(rd);
  84. _mutex.lock();
  85. queue::pop_front(_requests);
  86. _mutex.unlock();
  87. }
  88. return 0;
  89. }
  90. } // namespace crown