summaryrefslogtreecommitdiff
path: root/Runtime/Threads/Winapi/PlatformEvent.h
blob: 1aa590d19e9295108d956b9fffc5bf19f45aad5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef __PLATFORMEVENT_H
#define __PLATFORMEVENT_H

// Event synchronization object.

#if SUPPORT_THREADS

#include "Runtime/Utilities/NonCopyable.h"

class Event : public NonCopyable
{
public:
	explicit Event();
	~Event();

	void WaitForSignal();
	void Signal();

private:
	HANDLE m_Event;
};

inline Event::Event()
{
#if UNITY_WINRT
	m_Event = CreateEventExW(nullptr, nullptr, 0, 0);	// ?!-
#else
	m_Event = CreateEvent(NULL, FALSE, FALSE, NULL);
#endif
}

inline Event::~Event()
{
	if (m_Event != NULL)
		CloseHandle(m_Event);
}

inline void Event::WaitForSignal()
{
#if UNITY_WINRT
	WaitForSingleObjectEx(m_Event, INFINITE, FALSE);	// ?!-
#else
	while (1)
	{
		DWORD result = WaitForSingleObjectEx(m_Event, INFINITE, TRUE);
		switch (result)
		{
		case WAIT_OBJECT_0:
			// We got the event
			return;
		case WAIT_IO_COMPLETION:
			// Allow thread to run IO completion task
			Sleep(1);
			break;
		default:
			Assert (false);
			break;
		}
	}
#endif
}

inline void Event::Signal()
{
	SetEvent(m_Event);
}

#endif // SUPPORT_THREADS

#endif // __PLATFORMEVENT_H