// static Shmem::SharedMemory* Shmem::Alloc(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, size_t aNBytes, SharedMemoryType aType, bool /*unused*/, bool /*unused*/) { SharedMemory *segment = nsnull; if (aType == SharedMemory::TYPE_BASIC) segment = CreateSegment(SharedMemory::PageAlignedSize(aNBytes + sizeof(uint32)), SharedMemoryBasic::NULLHandle()); #ifdef MOZ_HAVE_SHAREDMEMORYSYSV else if (aType == SharedMemory::TYPE_SYSV) segment = CreateSegment(SharedMemory::PageAlignedSize(aNBytes + sizeof(uint32)), SharedMemorySysV::NULLHandle()); #endif else // Unhandled!! NS_ABORT(); if (!segment) return 0; *PtrToSize(segment) = static_cast<uint32>(aNBytes); return segment; }
// static already_AddRefed<Shmem::SharedMemory> Shmem::Alloc(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, size_t aNBytes, SharedMemoryType aType, bool /*unused*/, bool /*unused*/) { nsRefPtr<SharedMemory> segment; if (aType == SharedMemory::TYPE_BASIC) segment = CreateSegment(SharedMemory::PageAlignedSize(aNBytes + sizeof(uint32_t)), SharedMemoryBasic::NULLHandle()); #ifdef MOZ_HAVE_SHAREDMEMORYSYSV else if (aType == SharedMemory::TYPE_SYSV) segment = CreateSegment(SharedMemory::PageAlignedSize(aNBytes + sizeof(uint32_t)), SharedMemorySysV::NULLHandle()); #endif else { return nullptr; } if (!segment) return nullptr; *PtrToSize(segment) = static_cast<uint32_t>(aNBytes); return segment.forget(); }
// static already_AddRefed<Shmem::SharedMemory> Shmem::OpenExisting(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, const IPC::Message& aDescriptor, id_t* aId, bool /*unused*/) { if (SHMEM_CREATED_MESSAGE_TYPE != aDescriptor.type()) { return nullptr; } SharedMemory::SharedMemoryType type; void* iter = nullptr; size_t size; if (!ShmemCreated::ReadInfo(&aDescriptor, &iter, aId, &size, &type)) return nullptr; nsRefPtr<SharedMemory> segment; size_t segmentSize = SharedMemory::PageAlignedSize(size + sizeof(uint32_t)); if (SharedMemory::TYPE_BASIC == type) { SharedMemoryBasic::Handle handle; if (!ShmemCreated::ReadHandle(&aDescriptor, &iter, &handle)) return nullptr; if (!SharedMemoryBasic::IsHandleValid(handle)) { return nullptr; } segment = CreateSegment(segmentSize, handle); } #ifdef MOZ_HAVE_SHAREDMEMORYSYSV else if (SharedMemory::TYPE_SYSV == type) { SharedMemorySysV::Handle handle; if (!ShmemCreated::ReadHandle(&aDescriptor, &iter, &handle)) return nullptr; if (!SharedMemorySysV::IsHandleValid(handle)) { return nullptr; } segment = CreateSegment(segmentSize, handle); } #endif else { return nullptr; } if (!segment) return nullptr; // this is the only validity check done in non-DEBUG builds if (size != static_cast<size_t>(*PtrToSize(segment))) { return nullptr; } return segment.forget(); }
// static Shmem::SharedMemory* Shmem::OpenExisting(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, const IPC::Message& aDescriptor, id_t* aId, bool /*unused*/) { if (SHMEM_CREATED_MESSAGE_TYPE != aDescriptor.type()) NS_RUNTIMEABORT("expected 'shmem created' message"); SharedMemory::SharedMemoryType type; void* iter = 0; size_t size; if (!ShmemCreated::ReadInfo(&aDescriptor, &iter, aId, &size, &type)) return 0; SharedMemory* segment = 0; size_t segmentSize = SharedMemory::PageAlignedSize(size + sizeof(size_t)); if (SharedMemory::TYPE_BASIC == type) { SharedMemoryBasic::Handle handle; if (!ShmemCreated::ReadHandle(&aDescriptor, &iter, &handle)) return 0; if (!SharedMemoryBasic::IsHandleValid(handle)) NS_RUNTIMEABORT("trying to open invalid handle"); segment = CreateSegment(segmentSize, handle); } #ifdef MOZ_HAVE_SHAREDMEMORYSYSV else if (SharedMemory::TYPE_SYSV == type) { SharedMemorySysV::Handle handle; if (!ShmemCreated::ReadHandle(&aDescriptor, &iter, &handle)) return 0; if (!SharedMemorySysV::IsHandleValid(handle)) NS_RUNTIMEABORT("trying to open invalid handle"); segment = CreateSegment(segmentSize, handle); } #endif else { NS_RUNTIMEABORT("unknown shmem type"); } if (!segment) return 0; // this is the only validity check done OPT builds if (size != static_cast<size_t>(*PtrToSize(segment))) NS_RUNTIMEABORT("Alloc() segment size disagrees with OpenExisting()'s"); return segment; }
// static already_AddRefed<Shmem::SharedMemory> Shmem::Alloc(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, size_t aNBytes, SharedMemoryType aType, bool /*unused*/, bool /*unused*/) { RefPtr<SharedMemory> segment = CreateSegment(aType, aNBytes, sizeof(uint32_t)); if (!segment) { return nullptr; } *PtrToSize(segment) = static_cast<uint32_t>(aNBytes); return segment.forget(); }
// static already_AddRefed<Shmem::SharedMemory> Shmem::OpenExisting(IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead, const IPC::Message& aDescriptor, id_t* aId, bool /*unused*/) { size_t size; RefPtr<SharedMemory> segment = ReadSegment(aDescriptor, aId, &size, sizeof(uint32_t)); if (!segment) { return nullptr; } // this is the only validity check done in non-DEBUG builds if (size != static_cast<size_t>(*PtrToSize(segment))) { return nullptr; } return segment.forget(); }