19SocketPollThread::SocketPollThread(
const char_t* _name)
22 __pollInterrupt = WSACreateEvent();
25SocketPollThread::~SocketPollThread()
27 WSACloseEvent(__pollInterrupt);
30bool SocketPollThread::add(
PollAble* _pPollAble,
short _events)
44 if (((
Socket*)_pPollAble)->__waitEvent == WSA_INVALID_EVENT)
46 ((
Socket*)_pPollAble)->__waitEvent = WSACreateEvent();
47 if (((
Socket*)_pPollAble)->__waitEvent == WSA_INVALID_EVENT)
51 if (WSAEventSelect((SOCKET) (_pPollAble->
handle()),
52 ((
Socket*)_pPollAble)->__waitEvent, (
long) _events))
55 __updateList.add(Update(_pPollAble,
true));
59 WSASetEvent(__pollInterrupt);
64bool SocketPollThread::remove(
PollAble* _pPollAble)
71 __updateList.add(Update(_pPollAble,
false));
75 WSASetEvent(__pollInterrupt);
80void SocketPollThread::terminate()
84 WSASetEvent(__pollInterrupt);
87int SocketPollThread::run()
93 fds.
add(__pollInterrupt);
95 while (!__terminate) {
98 if (!__updateList.isEmpty()) {
99 WSAResetEvent(__pollInterrupt);
100 for (UpdateList::Iterator itUpdate = __updateList.begin();
101 itUpdate != __updateList.end(); itUpdate++) {
102 Update& update = *itUpdate;
106 update.pPollAble->toString().data());
107 pollAbles.
add((
Socket*) update.pPollAble);
108 fds.
add(((
Socket*) update.pPollAble)->__waitEvent);
111 Array<Socket*>::Iterator itPollAble =
113 if (itPollAble != pollAbles.
end()) {
115 update.pPollAble->toString().data());
116 onRemoved(*itPollAble);
117 pollAbles.
erase(itPollAble);
122 __updateList.clear();
128 DWORD
r = WSAWaitForMultipleEvents(
137 case WSA_WAIT_FAILED:
143 case WSA_WAIT_TIMEOUT:
146 case WSA_WAIT_EVENT_0:
147 WSASetEvent(__pollInterrupt);
150 size_t index =
r - WSA_WAIT_EVENT_0;
152 Socket* pSocket = pollAbles[index];
154 WSANETWORKEVENTS events;
156 ::WSAEnumNetworkEvents(
157 (SOCKET)(pSocket->
handle()), pSocket->__waitEvent, &events)
161 if (! pSocket->
onEvent((
short) events.lNetworkEvents,
this))
183 for (Array<Socket*>::Iterator itPollAble = pollAbles.
begin();
184 itPollAble != pollAbles.
end(); itPollAble++) {
186 if (*itPollAble !=
NULL) {
188 (*itPollAble)->toString().data());
189 onRemoved(*itPollAble);
194 for (UpdateList::Iterator itUpdate = __updateList.begin();
195 itUpdate != __updateList.end(); itUpdate++) {
196 Update& update = *itUpdate;
199 update.pPollAble->toString().data());
200 onRemoved(update.pPollAble);
#define __DCL_TRACE1(fmt, arg1)
#define __DCL_VERIFY(expr)
#define CLASSINFO(class_name)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
__DCL_BEGIN_NAMESPACE typedef PollThread SocketPollThread
Iterator erase(Iterator _pos)
ConstIterator end() const
Iterator find(const ELEMENT &_element)
Array< ELEMENT > & add(const ELEMENT &_element)
ConstIterator begin() const
size_t index(Iterator _pos) const
HandleType handle() const
virtual String toString() const
virtual String toString() const
virtual bool onEvent(short _revents, PollThread *_pPollThread) __DCL_THROWS1(IOException *)
static void sleep(unsigned int _mills)
static Thread * getCurrentThread()
SingleLock< Mutex > SingleLockMutex