Register user-modules with the kernel in UserModule::Restore

This commit is contained in:
Dr. Chat 2015-12-26 16:37:43 -06:00 committed by Ben Vanik
parent 2855036f72
commit bb5fd73b9e
4 changed files with 39 additions and 3 deletions

View File

@ -159,6 +159,31 @@ void KernelState::RegisterModule(XModule* module) {}
void KernelState::UnregisterModule(XModule* module) {}
bool KernelState::RegisterUserModule(object_ref<UserModule> module) {
auto lock = global_critical_region_.Acquire();
for (auto user_module : user_modules_) {
if (user_module->path() == module->path()) {
// Already loaded.
return false;
}
}
user_modules_.push_back(module);
return true;
}
void KernelState::UnregisterUserModule(UserModule* module) {
auto lock = global_critical_region_.Acquire();
for (auto it = user_modules_.begin(); it != user_modules_.end(); it++) {
if ((*it)->path() == module->path()) {
user_modules_.erase(it);
return;
}
}
}
bool KernelState::IsKernelModule(const char* name) {
if (!name) {
// Executing module isn't a kernel module.

View File

@ -120,6 +120,8 @@ class KernelState {
void RegisterModule(XModule* module);
void UnregisterModule(XModule* module);
bool RegisterUserModule(object_ref<UserModule> module);
void UnregisterUserModule(UserModule* module);
bool IsKernelModule(const char* name);
object_ref<XModule> GetModule(const char* name, bool user_only = false);

View File

@ -325,14 +325,19 @@ object_ref<UserModule> UserModule::Restore(KernelState* kernel_state,
// XModule::Save took care of this earlier...
// TODO: Find a nicer way to represent that here.
if (!module->RestoreObject(stream)) {
return false;
return nullptr;
}
auto result = module->LoadFromFile(path);
if (XFAILED(result)) {
XELOGD("UserModule::Restore LoadFromFile(%s) FAILED - code %.8X",
path.c_str(), result);
return false;
return nullptr;
}
if (!kernel_state->RegisterUserModule(retain_object(module))) {
// Already loaded?
assert_always();
}
return object_ref<UserModule>(module);

View File

@ -114,7 +114,7 @@ bool XModule::Save(ByteStream* stream) {
object_ref<XModule> XModule::Restore(KernelState* kernel_state,
ByteStream* stream) {
if (stream->Read<uint32_t>() != 'XMOD') {
return false;
return nullptr;
}
auto path = stream->Read<std::string>();
@ -123,6 +123,10 @@ object_ref<XModule> XModule::Restore(KernelState* kernel_state,
// Can only save user modules at the moment, so just redirect.
// TODO: Find a way to call RestoreObject here before UserModule::Restore.
auto module = UserModule::Restore(kernel_state, stream, path);
if (!module) {
return nullptr;
}
XELOGD("XModule %.8X (%s)", module->handle(), module->path_.c_str());
module->hmodule_ptr_ = hmodule_ptr;