RefPtr<SharedMemory> SharedMemory::map(const Handle& handle, Protection protection) { ASSERT(!handle.isNull()); int fd = handle.m_attachment.releaseFileDescriptor(); void* data = mmap(0, handle.m_attachment.size(), accessModeMMap(protection), MAP_SHARED, fd, 0); closeWithRetry(fd); if (data == MAP_FAILED) return nullptr; RefPtr<SharedMemory> instance = wrapMap(data, handle.m_attachment.size(), -1); instance->m_fileDescriptor = std::nullopt; instance->m_isWrappingMap = false; return instance; }
PassRefPtr<SharedMemory> SharedMemory::create(const Handle& handle, Protection protection) { ASSERT(!handle.isNull()); void* data = mmap(0, handle.m_size, accessModeMMap(protection), MAP_SHARED, handle.m_fileDescriptor, 0); if (data == MAP_FAILED) return 0; RefPtr<SharedMemory> instance = adoptRef(new SharedMemory()); instance->m_data = data; instance->m_fileDescriptor = handle.m_fileDescriptor; instance->m_size = handle.m_size; handle.m_fileDescriptor = -1; return instance; }
RefPtr<SharedMemory> SharedMemory::create(void* address, size_t size, Protection protection) { CString tempName; int fileDescriptor = -1; for (int tries = 0; fileDescriptor == -1 && tries < 10; ++tries) { String name = String("/WK2SharedMemory.") + String::number(static_cast<unsigned>(WTF::randomNumber() * (std::numeric_limits<unsigned>::max() + 1.0))); tempName = name.utf8(); do { fileDescriptor = shm_open(tempName.data(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); } while (fileDescriptor == -1 && errno == EINTR); } if (fileDescriptor == -1) { WTFLogAlways("Failed to create shared memory file %s: %s", tempName.data(), strerror(errno)); return 0; } while (ftruncate(fileDescriptor, size) == -1) { if (errno != EINTR) { closeWithRetry(fileDescriptor); shm_unlink(tempName.data()); return 0; } } void* data = mmap(address, size, accessModeMMap(protection), MAP_SHARED, fileDescriptor, 0); if (data == MAP_FAILED) { closeWithRetry(fileDescriptor); shm_unlink(tempName.data()); return 0; } shm_unlink(tempName.data()); RefPtr<SharedMemory> instance = adoptRef(new SharedMemory()); instance->m_data = data; instance->m_fileDescriptor = fileDescriptor; instance->m_size = size; return instance.release(); }