bool GMPVideoDecoderChild::Alloc(size_t aSize, Shmem::SharedMemory::SharedMemoryType aType, Shmem* aMem) { MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); bool rv; #ifndef SHMEM_ALLOC_IN_CHILD ++mNeedShmemIntrCount; rv = CallNeedShmem(aSize, aMem); --mNeedShmemIntrCount; if (mPendingDecodeComplete && mNeedShmemIntrCount == 0) { mPendingDecodeComplete = false; mPlugin->GMPMessageLoop()->PostTask( NewRunnableMethod(this, &GMPVideoDecoderChild::RecvDecodingComplete)); } #else #ifdef GMP_SAFE_SHMEM rv = AllocShmem(aSize, aType, aMem); #else rv = AllocUnsafeShmem(aSize, aType, aMem); #endif #endif return rv; }
void TestSysVShmemParent::Main() { Shmem mem; size_t size = 12345; if (!AllocShmem(size, SharedMemory::TYPE_SYSV, &mem)) fail("can't alloc shmem"); if (0 > mem.GetSysVID()) fail("invalid shmem ID"); if (mem.Size<char>() != size) fail("shmem is wrong size: expected %lu, got %lu", size, mem.Size<char>()); char* ptr = mem.get<char>(); memcpy(ptr, "Hello!", sizeof("Hello!")); if (!SendGive(mem, size)) fail("can't send Give()"); // uncomment the following line for a (nondeterministic) surprise! //char c1 = *ptr; (void)c1; // uncomment the following line for a deterministic surprise! //char c2 = *mem.get<char>(); (void)c2; }
void TestShmemParent::Main() { Shmem mem; Shmem unsafe; size_t size = 12345; if (!AllocShmem(size, SharedMemory::TYPE_BASIC, &mem)) fail("can't alloc shmem"); if (!AllocUnsafeShmem(size, SharedMemory::TYPE_BASIC, &unsafe)) fail("can't alloc shmem"); if (mem.Size<char>() != size) fail("shmem is wrong size: expected %lu, got %lu", size, mem.Size<char>()); if (unsafe.Size<char>() != size) fail("shmem is wrong size: expected %lu, got %lu", size, unsafe.Size<char>()); char* ptr = mem.get<char>(); memcpy(ptr, "Hello!", sizeof("Hello!")); char* unsafeptr = unsafe.get<char>(); memcpy(unsafeptr, "Hello!", sizeof("Hello!")); Shmem unsafecopy = unsafe; if (!SendGive(mem, unsafe, size)) fail("can't send Give()"); // uncomment the following line for a (nondeterministic) surprise! //char c1 = *ptr; (void)c1; // uncomment the following line for a deterministic surprise! //char c2 = *mem.get<char>(); (void)c2; // unsafe shmem gets rid of those checks char uc1 = *unsafeptr; (void)uc1; char uc2 = *unsafecopy.get<char>(); (void)uc2; }