暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

MemoryMappedFile.cpp 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "il2cpp-config.h"
  2. #include "MemoryMappedFile.h"
  3. #include "Baselib.h"
  4. #include "Cpp/ReentrantLock.h"
  5. namespace il2cpp
  6. {
  7. namespace utils
  8. {
  9. static baselib::ReentrantLock s_Mutex;
  10. static std::map<void*, os::FileHandle*> s_MappedAddressToMappedFileObject;
  11. static std::map<void*, int64_t> s_MappedAddressToMappedLength;
  12. void* MemoryMappedFile::Map(os::FileHandle* file)
  13. {
  14. return Map(file, 0, 0);
  15. }
  16. bool MemoryMappedFile::Unmap(void* address)
  17. {
  18. return Unmap(address, 0);
  19. }
  20. void* MemoryMappedFile::Map(os::FileHandle* file, int64_t length, int64_t offset)
  21. {
  22. return Map(file, length, offset, os::MMAP_FILE_ACCESS_READ);
  23. }
  24. void* MemoryMappedFile::Map(os::FileHandle* file, int64_t length, int64_t offset, int32_t access)
  25. {
  26. os::FastAutoLock lock(&s_Mutex);
  27. int64_t unused = 0;
  28. os::MemoryMappedFileError error = os::NO_MEMORY_MAPPED_FILE_ERROR;
  29. os::FileHandle* mappedFileHandle = os::MemoryMappedFile::Create(file, NULL, 0, &unused, (os::MemoryMappedFileAccess)access, 0, &error);
  30. if (error != 0)
  31. return NULL;
  32. int64_t actualOffset = offset;
  33. void* address = os::MemoryMappedFile::View(mappedFileHandle, &length, offset, (os::MemoryMappedFileAccess)access, &actualOffset, &error);
  34. if (address != NULL)
  35. {
  36. address = (uint8_t*)address + (offset - actualOffset);
  37. if (os::MemoryMappedFile::OwnsDuplicatedFileHandle(mappedFileHandle))
  38. s_MappedAddressToMappedFileObject[address] = mappedFileHandle;
  39. s_MappedAddressToMappedLength[address] = length;
  40. }
  41. return address;
  42. }
  43. bool MemoryMappedFile::Unmap(void* address, int64_t length)
  44. {
  45. os::FastAutoLock lock(&s_Mutex);
  46. if (length == 0)
  47. {
  48. std::map<void*, int64_t>::iterator entry = s_MappedAddressToMappedLength.find(address);
  49. if (entry != s_MappedAddressToMappedLength.end())
  50. {
  51. length = entry->second;
  52. s_MappedAddressToMappedLength.erase(entry);
  53. }
  54. }
  55. bool success = os::MemoryMappedFile::UnmapView(address, length);
  56. if (!success)
  57. return false;
  58. std::map<void*, os::FileHandle*>::iterator entry = s_MappedAddressToMappedFileObject.find(address);
  59. if (entry != s_MappedAddressToMappedFileObject.end())
  60. {
  61. bool result = os::MemoryMappedFile::Close(entry->second);
  62. s_MappedAddressToMappedFileObject.erase(entry);
  63. return result;
  64. }
  65. return true;
  66. }
  67. }
  68. }