knightonline/server/shared/SocketDefines.h

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;
}
};