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; }
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; }