resource_loader.cpp 1.9 KB

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