本文整理汇总了C++中Area::ReleaseRef方法的典型用法代码示例。如果您正苦于以下问题:C++ Area::ReleaseRef方法的具体用法?C++ Area::ReleaseRef怎么用?C++ Area::ReleaseRef使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Area
的用法示例。
在下文中一共展示了Area::ReleaseRef方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: clone_area
int clone_area(const char name[], void **clone_addr, int searchFlags,
PageProtection protection, int sourceArea)
{
Area *area = static_cast<Area*>(GetResource(sourceArea, OBJ_AREA));
if (area == 0) {
printf("clone_area: source area id %08x is invalid\n", sourceArea);
return E_BAD_HANDLE;
}
unsigned int addr = INVALID_PAGE;
if (searchFlags & EXACT_ADDRESS)
addr = reinterpret_cast<unsigned int>(*clone_addr);
// It is important that CreateArea not incur a fault!
char nameCopy[OS_NAME_LENGTH];
if (!CopyUser(nameCopy, name, OS_NAME_LENGTH))
return E_BAD_ADDRESS;
Area *newArea = AddressSpace::GetCurrentAddressSpace()->CreateArea(nameCopy, area->GetSize(), AREA_NOT_WIRED,
protection | USER_READ | SYSTEM_READ | ((protection & USER_WRITE)
? SYSTEM_WRITE : 0), area->GetPageCache(), 0, addr, searchFlags);
area->ReleaseRef();
if (newArea == 0)
return E_ERROR;
*clone_addr = reinterpret_cast<void*>(newArea->GetBaseAddress());
return OpenHandle(newArea);
}
示例2: resize_area
// Only works for areas in the current team.
int resize_area(int area_id, unsigned int newSize)
{
Area *area = static_cast<Area*>(GetResource(area_id, OBJ_AREA));
if (area == 0)
return E_BAD_HANDLE;
int error = AddressSpace::GetCurrentAddressSpace()->ResizeArea(area, newSize);
area->ReleaseRef();
return error;
}
示例3: delete_area
int delete_area(int handle)
{
Area *area = static_cast<Area*>(GetResource(handle, OBJ_AREA));
if (area == 0)
return E_BAD_HANDLE;
Thread::GetRunningThread()->GetTeam()->GetHandleTable()->Close(handle);
AddressSpace::GetCurrentAddressSpace()->DeleteArea(area);
area->ReleaseRef();
return E_NO_ERROR;
}
示例4: iterator
AddressSpace::~AddressSpace()
{
for (;;) {
// This is a very clunky way to step through the area tree while
// removing items from it. The iterator must be re-created because
// it will become invalid after each area is removed from the tree.
AVLTreeIterator iterator(fAreas, true);
Area *area = static_cast<Area*>(iterator.GetCurrent());
if (area == 0)
break;
// Don't unmap the pages because:
// 1. The address space is going away anyway
// 2. This would unmap the kernel. :)
fAreas.Remove(area);
area->ReleaseRef();
}
delete fPhysicalMap;
}