resource_loader.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 "log.h"
  9. #include "queue.h"
  10. #include "filesystem.h"
  11. namespace crown
  12. {
  13. ResourceLoader::ResourceLoader(Filesystem& fs, Allocator& resource_heap)
  14. : _fs(fs)
  15. , _resource_heap(resource_heap)
  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::load(ResourceId id)
  28. {
  29. add_request(id);
  30. }
  31. void ResourceLoader::flush()
  32. {
  33. while (num_requests()) {}
  34. }
  35. void ResourceLoader::add_request(ResourceId id)
  36. {
  37. ScopedMutex sm(_mutex);
  38. queue::push_back(_requests, id);
  39. }
  40. uint32_t ResourceLoader::num_requests()
  41. {
  42. ScopedMutex sm(_mutex);
  43. return queue::size(_requests);
  44. }
  45. void ResourceLoader::add_loaded(ResourceData data)
  46. {
  47. ScopedMutex sm(_loaded_mutex);
  48. queue::push_back(_loaded, data);
  49. }
  50. void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
  51. {
  52. ScopedMutex sm(_loaded_mutex);
  53. uint32_t num = queue::size(_loaded);
  54. for (uint32_t i = 0; i < num; i++)
  55. {
  56. array::push_back(loaded, queue::front(_loaded));
  57. queue::pop_front(_loaded);
  58. }
  59. }
  60. int32_t ResourceLoader::run()
  61. {
  62. while (!_exit)
  63. {
  64. _mutex.lock();
  65. if (queue::empty(_requests))
  66. {
  67. _mutex.unlock();
  68. continue;
  69. }
  70. ResourceId id = queue::front(_requests);
  71. _mutex.unlock();
  72. ResourceData rd;
  73. rd.id = id;
  74. char path[64];
  75. id.to_string(path);
  76. File* file = _fs.open(path, FOM_READ);
  77. rd.data = resource_on_load(id.type, *file, _resource_heap);
  78. _fs.close(file);
  79. add_loaded(rd);
  80. _mutex.lock();
  81. queue::pop_front(_requests);
  82. _mutex.unlock();
  83. }
  84. return 0;
  85. }
  86. } // namespace crown