mirror of
https://github.com/corda/corda.git
synced 2025-06-20 08:03:53 +00:00
implement non-blocking socket connections
This commit is contained in:
@ -36,6 +36,7 @@
|
||||
|
||||
#define java_nio_channels_SelectionKey_OP_READ 1L
|
||||
#define java_nio_channels_SelectionKey_OP_WRITE 4L
|
||||
#define java_nio_channels_SelectionKey_OP_CONNECT 8L
|
||||
#define java_nio_channels_SelectionKey_OP_ACCEPT 16L
|
||||
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
@ -371,6 +372,21 @@ Java_java_nio_channels_SocketChannel_natDoConnect(JNIEnv *e,
|
||||
return s;
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jboolean JNICALL
|
||||
Java_java_nio_channels_SocketChannel_natFinishConnect(JNIEnv *e,
|
||||
jclass,
|
||||
jint socket)
|
||||
{
|
||||
int error;
|
||||
socklen_t size = sizeof(int);
|
||||
int r = getsockopt(socket, SOL_SOCKET, SO_ERROR,
|
||||
reinterpret_cast<char*>(&error), &size);
|
||||
if (r != 0 or size != sizeof(int) or error != 0) {
|
||||
throwIOException(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jint JNICALL
|
||||
Java_java_nio_channels_SocketChannel_natRead(JNIEnv *e,
|
||||
jclass,
|
||||
@ -626,7 +642,8 @@ Java_java_nio_channels_SocketSelector_natSelectUpdateInterestSet(JNIEnv *,
|
||||
FD_CLR(static_cast<unsigned>(socket), &(s->read));
|
||||
}
|
||||
|
||||
if (interest & java_nio_channels_SelectionKey_OP_WRITE) {
|
||||
if (interest & (java_nio_channels_SelectionKey_OP_WRITE |
|
||||
java_nio_channels_SelectionKey_OP_CONNECT)) {
|
||||
FD_SET(static_cast<unsigned>(socket), &(s->write));
|
||||
if (max < socket) max = socket;
|
||||
} else {
|
||||
@ -748,10 +765,16 @@ Java_java_nio_channels_SocketSelector_natUpdateReadySet(JNIEnv *, jclass,
|
||||
}
|
||||
}
|
||||
|
||||
if ((interest & java_nio_channels_SelectionKey_OP_WRITE)
|
||||
and FD_ISSET(socket, &(s->write))) {
|
||||
ready |= java_nio_channels_SelectionKey_OP_WRITE;
|
||||
if (FD_ISSET(socket, &(s->write))) {
|
||||
if (interest & java_nio_channels_SelectionKey_OP_WRITE) {
|
||||
ready |= java_nio_channels_SelectionKey_OP_WRITE;
|
||||
}
|
||||
|
||||
if (interest & java_nio_channels_SelectionKey_OP_CONNECT) {
|
||||
ready |= java_nio_channels_SelectionKey_OP_CONNECT;
|
||||
}
|
||||
}
|
||||
|
||||
return ready;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user