65 lines
1.1 KiB
C++
65 lines
1.1 KiB
C++
#pragma once
|
|
|
|
enum SocketIOEvent
|
|
{
|
|
SOCKET_IO_EVENT_READ_COMPLETE = 0,
|
|
SOCKET_IO_EVENT_WRITE_END = 1,
|
|
SOCKET_IO_THREAD_SHUTDOWN = 2,
|
|
NUM_SOCKET_IO_EVENTS = 3,
|
|
};
|
|
|
|
class OverlappedStruct
|
|
{
|
|
public:
|
|
#ifdef _WIN32
|
|
OVERLAPPED m_overlap;
|
|
#else
|
|
// Linux equivalent using epoll data
|
|
struct {
|
|
unsigned long Internal;
|
|
unsigned long InternalHigh;
|
|
union {
|
|
struct {
|
|
unsigned long Offset;
|
|
unsigned long OffsetHigh;
|
|
};
|
|
void* Pointer;
|
|
};
|
|
int hEvent;
|
|
} m_overlap;
|
|
#endif
|
|
SocketIOEvent m_event;
|
|
|
|
Atomic<bool> m_inUse;
|
|
|
|
OverlappedStruct(SocketIOEvent ev) : m_event(ev)
|
|
{
|
|
memset(&m_overlap, 0, sizeof(m_overlap));
|
|
m_inUse = false;
|
|
};
|
|
|
|
OverlappedStruct()
|
|
{
|
|
memset(&m_overlap, 0, sizeof(m_overlap));
|
|
m_inUse = false;
|
|
}
|
|
|
|
INLINE void Reset(SocketIOEvent ev)
|
|
{
|
|
memset(&m_overlap, 0, sizeof(m_overlap));
|
|
m_event = ev;
|
|
}
|
|
|
|
void Mark()
|
|
{
|
|
bool val = false;
|
|
if (!m_inUse.compare_exchange(val, true))
|
|
TRACE("!!!! Network: Detected double use of read/write event! Previous event was %u.\n", m_event);
|
|
}
|
|
|
|
void Unmark()
|
|
{
|
|
m_inUse = false;
|
|
}
|
|
};
|