Enough of ObOpenObjectByName to handle basic usage + asserts for others.

Fixes #143.
This commit is contained in:
Ben Vanik
2015-02-11 09:42:12 -08:00
parent 2c49eec79f
commit 90e489527a
7 changed files with 175 additions and 28 deletions

View File

@@ -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