Enough of ObOpenObjectByName to handle basic usage + asserts for others.
Fixes #143.
This commit is contained in:
@@ -151,7 +151,8 @@ X_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) {
|
||||
return result;
|
||||
}
|
||||
|
||||
X_STATUS ObjectTable::GetObject(X_HANDLE handle, XObject** out_object) {
|
||||
X_STATUS ObjectTable::GetObject(X_HANDLE handle, XObject** out_object,
|
||||
bool already_locked) {
|
||||
assert_not_null(out_object);
|
||||
|
||||
X_STATUS result = X_STATUS_SUCCESS;
|
||||
@@ -162,28 +163,32 @@ X_STATUS ObjectTable::GetObject(X_HANDLE handle, XObject** out_object) {
|
||||
}
|
||||
|
||||
XObject* object = NULL;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(table_mutex_);
|
||||
if (!already_locked) {
|
||||
table_mutex_.lock();
|
||||
}
|
||||
|
||||
// Lower 2 bits are ignored.
|
||||
uint32_t slot = handle >> 2;
|
||||
// Lower 2 bits are ignored.
|
||||
uint32_t slot = handle >> 2;
|
||||
|
||||
// Verify slot.
|
||||
if (slot > table_capacity_) {
|
||||
result = X_STATUS_INVALID_HANDLE;
|
||||
// Verify slot.
|
||||
if (slot > table_capacity_) {
|
||||
result = X_STATUS_INVALID_HANDLE;
|
||||
} else {
|
||||
ObjectTableEntry& entry = table_[slot];
|
||||
if (entry.object) {
|
||||
object = entry.object;
|
||||
} else {
|
||||
ObjectTableEntry& entry = table_[slot];
|
||||
if (entry.object) {
|
||||
object = entry.object;
|
||||
} else {
|
||||
result = X_STATUS_INVALID_HANDLE;
|
||||
}
|
||||
result = X_STATUS_INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
// Retain the object pointer.
|
||||
if (object) {
|
||||
object->Retain();
|
||||
}
|
||||
// Retain the object pointer.
|
||||
if (object) {
|
||||
object->Retain();
|
||||
}
|
||||
|
||||
if (!already_locked) {
|
||||
table_mutex_.unlock();
|
||||
}
|
||||
|
||||
*out_object = object;
|
||||
@@ -203,5 +208,42 @@ X_HANDLE ObjectTable::TranslateHandle(X_HANDLE handle) {
|
||||
}
|
||||
}
|
||||
|
||||
X_STATUS ObjectTable::AddNameMapping(const std::string& name, X_HANDLE handle) {
|
||||
std::lock_guard<std::mutex> lock(table_mutex_);
|
||||
if (name_table_.count(name)) {
|
||||
return X_STATUS_OBJECT_NAME_COLLISION;
|
||||
}
|
||||
name_table_.insert({ name, handle });
|
||||
return X_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void ObjectTable::RemoveNameMapping(const std::string& name) {
|
||||
std::lock_guard<std::mutex> lock(table_mutex_);
|
||||
auto it = name_table_.find(name);
|
||||
if (it != name_table_.end()) {
|
||||
name_table_.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
X_STATUS ObjectTable::GetObjectByName(const std::string& name,
|
||||
X_HANDLE* out_handle) {
|
||||
std::lock_guard<std::mutex> lock(table_mutex_);
|
||||
auto it = name_table_.find(name);
|
||||
if (it == name_table_.end()) {
|
||||
*out_handle = X_INVALID_HANDLE_VALUE;
|
||||
return X_STATUS_OBJECT_NAME_NOT_FOUND;
|
||||
}
|
||||
*out_handle = it->second;
|
||||
|
||||
// We need to ref the handle. I think.
|
||||
XObject* obj = nullptr;
|
||||
if (XSUCCEEDED(GetObject(it->second, &obj, true))) {
|
||||
obj->RetainHandle();
|
||||
obj->Release();
|
||||
}
|
||||
|
||||
return X_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
} // namespace kernel
|
||||
} // namespace xe
|
||||
|
||||
Reference in New Issue
Block a user