XEvent Save/Restore (TODO: Write signaled state)

This commit is contained in:
Dr. Chat 2015-12-01 18:52:19 -06:00 committed by Ben Vanik
parent ce92dd5691
commit 6e0057020c
2 changed files with 37 additions and 4 deletions

View File

@ -9,6 +9,7 @@
#include "xenia/kernel/xevent.h" #include "xenia/kernel/xevent.h"
#include "xenia/base/byte_stream.h"
#include "xenia/base/logging.h" #include "xenia/base/logging.h"
namespace xe { namespace xe {
@ -33,13 +34,12 @@ void XEvent::Initialize(bool manual_reset, bool initial_state) {
void XEvent::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) { void XEvent::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) {
assert_false(event_); assert_false(event_);
bool manual_reset;
switch (header->type) { switch (header->type) {
case 0x00: // EventNotificationObject (manual reset) case 0x00: // EventNotificationObject (manual reset)
manual_reset = true; manual_reset_ = true;
break; break;
case 0x01: // EventSynchronizationObject (auto reset) case 0x01: // EventSynchronizationObject (auto reset)
manual_reset = false; manual_reset_ = false;
break; break;
default: default:
assert_always(); assert_always();
@ -47,7 +47,7 @@ void XEvent::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) {
} }
bool initial_state = header->signal_state ? true : false; bool initial_state = header->signal_state ? true : false;
if (manual_reset) { if (manual_reset_) {
event_ = xe::threading::Event::CreateManualResetEvent(initial_state); event_ = xe::threading::Event::CreateManualResetEvent(initial_state);
} else { } else {
event_ = xe::threading::Event::CreateAutoResetEvent(initial_state); event_ = xe::threading::Event::CreateAutoResetEvent(initial_state);
@ -71,5 +71,33 @@ int32_t XEvent::Reset() {
void XEvent::Clear() { event_->Reset(); } void XEvent::Clear() { event_->Reset(); }
bool XEvent::Save(ByteStream* stream) {
XELOGD("XEvent %.8X (%s)", handle(), manual_reset_ ? "manual" : "auto");
SaveObject(stream);
// TODO: Write if we're currently signaled.
stream->Write<bool>(manual_reset_);
return true;
}
object_ref<XEvent> XEvent::Restore(KernelState* kernel_state,
ByteStream* stream) {
auto evt = new XEvent(nullptr);
evt->kernel_state_ = kernel_state;
evt->RestoreObject(stream);
evt->manual_reset_ = stream->Read<bool>();
if (evt->manual_reset_) {
evt->event_ = xe::threading::Event::CreateManualResetEvent(false);
} else {
evt->event_ = xe::threading::Event::CreateAutoResetEvent(false);
}
evt->Retain();
return object_ref<XEvent>(evt);
}
} // namespace kernel } // namespace kernel
} // namespace xe } // namespace xe

View File

@ -39,7 +39,12 @@ class XEvent : public XObject {
xe::threading::WaitHandle* GetWaitHandle() override { return event_.get(); } xe::threading::WaitHandle* GetWaitHandle() override { return event_.get(); }
bool Save(ByteStream* stream) override;
static object_ref<XEvent> Restore(KernelState* kernel_state,
ByteStream* stream);
private: private:
bool manual_reset_ = false;
std::unique_ptr<xe::threading::Event> event_; std::unique_ptr<xe::threading::Event> event_;
}; };