/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2013 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #include "xenia/kernel/objects/xevent.h" namespace xe { namespace kernel { XEvent::XEvent(KernelState* kernel_state) : XObject(kernel_state, kTypeEvent), handle_(NULL) {} XEvent::~XEvent() { if (handle_) { CloseHandle(handle_); } } void XEvent::Initialize(bool manual_reset, bool initial_state) { assert_null(handle_); handle_ = CreateEvent(NULL, manual_reset, initial_state, NULL); } void XEvent::InitializeNative(void* native_ptr, DISPATCH_HEADER& header) { assert_null(handle_); bool manual_reset; switch ((header.type_flags >> 24) & 0xFF) { case 0x00: // EventNotificationObject (manual reset) manual_reset = true; break; case 0x01: // EventSynchronizationObject (auto reset) manual_reset = false; break; default: assert_always(); return; } bool initial_state = header.signal_state ? true : false; handle_ = CreateEvent(NULL, manual_reset, initial_state, NULL); } int32_t XEvent::Set(uint32_t priority_increment, bool wait) { return SetEvent(handle_) ? 1 : 0; } int32_t XEvent::Pulse(uint32_t priority_increment, bool wait) { return PulseEvent(handle_) ? 1 : 0; } int32_t XEvent::Reset() { return ResetEvent(handle_) ? 1 : 0; } void XEvent::Clear() { ResetEvent(handle_); } } // namespace kernel } // namespace xe