resource_loader.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 "resource_registry.h"
  9. #include "queue.h"
  10. #include "filesystem.h"
  11. #include "temp_allocator.h"
  12. #include "path.h"
  13. namespace crown
  14. {
  15. ResourceLoader::ResourceLoader(Filesystem& fs)
  16. : _fs(fs)
  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::add_request(StringId64 type, StringId64 name, Allocator& a)
  29. {
  30. ScopedMutex sm(_mutex);
  31. queue::push_back(_requests, make_request(type, name, a));
  32. }
  33. void ResourceLoader::flush()
  34. {
  35. while (num_requests()) {}
  36. }
  37. uint32_t ResourceLoader::num_requests()
  38. {
  39. ScopedMutex sm(_mutex);
  40. return queue::size(_requests);
  41. }
  42. void ResourceLoader::add_loaded(ResourceData data)
  43. {
  44. ScopedMutex sm(_loaded_mutex);
  45. queue::push_back(_loaded, data);
  46. }
  47. void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
  48. {
  49. ScopedMutex sm(_loaded_mutex);
  50. uint32_t num = queue::size(_loaded);
  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 id = queue::front(_requests);
  68. _mutex.unlock();
  69. ResourceData rd;
  70. rd.type = id.type;
  71. rd.name = id.name;
  72. char name[1 + 2*StringId64::STRING_LENGTH];
  73. id.type.to_string(name);
  74. name[16] = '-';
  75. id.name.to_string(name + 17);
  76. TempAllocator256 alloc;
  77. DynamicString path(alloc);
  78. path::join(CROWN_DATA_DIRECTORY, name, path);
  79. File* file = _fs.open(path.c_str(), FOM_READ);
  80. rd.data = resource_on_load(id.type, *file, *id.allocator);
  81. _fs.close(file);
  82. add_loaded(rd);
  83. _mutex.lock();
  84. queue::pop_front(_requests);
  85. _mutex.unlock();
  86. }
  87. return 0;
  88. }
  89. } // namespace crown