natSelectorImplWin32.cc [plain text]
#include <config.h>
#include <platform.h>
#include <gnu/java/nio/VMSelector.h>
#include <java/lang/Thread.h>
jint
gnu::java::nio::VMSelector::select (jintArray read, jintArray write,
jintArray except, jlong timeout)
{
jint* pReadFD = elements (read);
int nNbReadFDs = JvGetArrayLength (read);
jint* pWriteFD = elements (write);
int nNbWriteFDs = JvGetArrayLength (write);
int nNbEvents = nNbReadFDs + nNbWriteFDs;
WSAEventWrapper aArray[nNbEvents];
int nCurIndex = 0;
for (int i=0; i < nNbReadFDs; ++i)
aArray[nCurIndex++].init(pReadFD[i], FD_ACCEPT | FD_READ);
for (int i=0; i < nNbWriteFDs; ++i)
aArray[nCurIndex++].init(pWriteFD[i], FD_WRITE);
HANDLE arh[nNbEvents + 1];
for (int i=0; i < nNbEvents; ++i)
arh[i] = aArray[i].getEventHandle();
arh[nNbEvents] = _Jv_Win32GetInterruptEvent ();
if (timeout <= 0)
timeout = WSA_INFINITE;
DWORD dwRet = WSAWaitForMultipleEvents (nNbEvents+1, arh, 0, timeout, false);
if (dwRet == WSA_WAIT_FAILED)
_Jv_ThrowIOException ();
memset(pReadFD, 0, sizeof(jint) * nNbReadFDs);
memset(pWriteFD, 0, sizeof(jint) * nNbWriteFDs);
memset(elements (except), 0, sizeof(jint) * JvGetArrayLength (except));
if (dwRet == DWORD(WSA_WAIT_EVENT_0 + nNbEvents))
{
::java::lang::Thread::currentThread ()->interrupt ();
return 0;
}
else if (dwRet < DWORD(WSA_WAIT_EVENT_0 + nNbEvents))
{
int nSelectedEventIndex = dwRet - WSA_WAIT_EVENT_0;
jint fd = aArray[nSelectedEventIndex].getFD();
if (nSelectedEventIndex < nNbReadFDs)
pReadFD[0] = fd;
else
pWriteFD[0] = fd;
return 1;
}
else
return 0;
}