NotifyListener Save/Restore

This commit is contained in:
Dr. Chat 2015-12-06 15:40:42 -06:00 committed by Ben Vanik
parent 87931369e4
commit 7d30e1297a
2 changed files with 39 additions and 0 deletions

View File

@ -9,6 +9,7 @@
#include "xenia/kernel/notify_listener.h" #include "xenia/kernel/notify_listener.h"
#include "xenia/base/byte_stream.h"
#include "xenia/kernel/kernel_state.h" #include "xenia/kernel/kernel_state.h"
namespace xe { namespace xe {
@ -83,5 +84,39 @@ bool NotifyListener::DequeueNotification(XNotificationID id,
return dequeued; return dequeued;
} }
bool NotifyListener::Save(ByteStream* stream) {
SaveObject(stream);
stream->Write(mask_);
stream->Write(notification_count_);
if (notification_count_) {
for (auto pair : notifications_) {
stream->Write<uint32_t>(pair.first);
stream->Write<uint32_t>(pair.second);
}
}
return true;
}
object_ref<NotifyListener> NotifyListener::Restore(KernelState* kernel_state,
ByteStream* stream) {
auto notify = new NotifyListener(nullptr);
notify->kernel_state_ = kernel_state;
notify->RestoreObject(stream);
notify->Initialize(stream->Read<uint64_t>());
notify->notification_count_ = stream->Read<size_t>();
for (size_t i = 0; i < notify->notification_count_; i++) {
std::pair<XNotificationID, uint32_t> pair;
pair.first = stream->Read<uint32_t>();
pair.second = stream->Read<uint32_t>();
notify->notifications_.insert(pair);
}
return object_ref<NotifyListener>(notify);
}
} // namespace kernel } // namespace kernel
} // namespace xe } // namespace xe

View File

@ -40,6 +40,10 @@ class NotifyListener : public XObject {
return wait_handle_.get(); return wait_handle_.get();
} }
bool Save(ByteStream* stream) override;
static object_ref<NotifyListener> Restore(KernelState* kernel_state,
ByteStream* stream);
private: private:
std::unique_ptr<xe::threading::Event> wait_handle_; std::unique_ptr<xe::threading::Event> wait_handle_;
xe::global_critical_region global_critical_region_; xe::global_critical_region global_critical_region_;