66 lines
1.9 KiB
C++
66 lines
1.9 KiB
C++
/**
|
|
******************************************************************************
|
|
* 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/base/logging.h"
|
|
#include "xenia/kernel/objects/xevent.h"
|
|
|
|
namespace xe {
|
|
namespace kernel {
|
|
|
|
XEvent::XEvent(KernelState* kernel_state)
|
|
: XObject(kernel_state, kTypeEvent), native_handle_(NULL) {}
|
|
|
|
XEvent::~XEvent() {
|
|
if (native_handle_) {
|
|
CloseHandle(native_handle_);
|
|
}
|
|
}
|
|
|
|
void XEvent::Initialize(bool manual_reset, bool initial_state) {
|
|
assert_null(native_handle_);
|
|
|
|
native_handle_ = CreateEvent(NULL, manual_reset, initial_state, NULL);
|
|
}
|
|
|
|
void XEvent::InitializeNative(void* native_ptr, X_DISPATCH_HEADER& header) {
|
|
assert_null(native_handle_);
|
|
|
|
bool manual_reset;
|
|
switch (header.type) {
|
|
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;
|
|
|
|
native_handle_ = CreateEvent(NULL, manual_reset, initial_state, NULL);
|
|
}
|
|
|
|
int32_t XEvent::Set(uint32_t priority_increment, bool wait) {
|
|
return SetEvent(native_handle_) ? 1 : 0;
|
|
}
|
|
|
|
int32_t XEvent::Pulse(uint32_t priority_increment, bool wait) {
|
|
return PulseEvent(native_handle_) ? 1 : 0;
|
|
}
|
|
|
|
int32_t XEvent::Reset() { return ResetEvent(native_handle_) ? 1 : 0; }
|
|
|
|
void XEvent::Clear() { ResetEvent(native_handle_); }
|
|
|
|
} // namespace kernel
|
|
} // namespace xe
|