Esempio n. 1
0
SharedMemory * MemoryServer::insertShared(ProcessID procID,
					  char *key, Size size,
					  MemoryRange *range, bool *created)
{
    SharedMemory *obj = findShared(key);
    bool needCreate = obj == ZERO;

    if (needCreate)
        obj = new SharedMemory;

    range->virtualAddress  = findFreeRange(procID, size);
    range->bytes      = size;
    range->access     = Memory::Present | Memory::User | Memory::Readable | Memory::Writable | Memory::Pinned;

    /* Only create a new mapping, if non-existent. */
    if (needCreate)
    {
	range->physicalAddress = ZERO;	
	VMCtl(procID, Map, range);
	
	/* Create new shared memory object. */
	obj->size = size;
	obj->key  = key;
	obj->address = range->physicalAddress;

	/* Insert to the list. */
	shared.append(obj);
	
	/* We created a new mapping, flag that. */
	if (created) *created = true;
    }
    else
    {
	range->physicalAddress = obj->address;
	VMCtl(procID, Map, range);
	
	/* We didn't create a new mapping, flag that. */
	if (created) *created = false;
    }
    /* Done. */
    return obj;
}
Esempio n. 2
0
SharedMemory * MemoryServer::insertShared(ProcessID procID,
					  char *key, Size size,
					  MemoryRange *range, bool *created)
{
    SharedMemory *obj;

    range->virtualAddress  = findFreeRange(procID, size);
    range->bytes      = size;
    range->protection = PAGE_PRESENT | PAGE_USER | PAGE_RW | PAGE_PINNED;

    /* Only create a new mapping, if non-existent. */
    if (!(obj = findShared(key)))
    {
	range->physicalAddress = ZERO;	
	VMCtl(procID, Map, range);
	
	/* Create new shared memory object. */
	obj = new SharedMemory;
	obj->size = size;
	obj->key  = new String(key);
	obj->address = range->physicalAddress;

	/* Insert to the list. */
	shared.insertTail(obj);
	
	/* We created a new mapping, flag that. */
	if (created) *created = true;
    }
    else
    {
	range->physicalAddress = obj->address;
	VMCtl(procID, Map, range);
	
	/* We didn't create a new mapping, flag that. */
	if (created) *created = false;
    }
    /* Done. */
    return obj;
}