This is the poll model earlier than 6.0.
Solaris \ native \ sun \ nio \ ch \ SocketChannelImpl. cJNIEXPORT jint JNICALL
Java_sun_nio_ch_SocketChannelImpl_checkConnect (JNIEnv * env, jobject this,
Jobject fdo, jboolean block,
Jboolean ready)
{
Int error = 0;
Int n = sizeof (int );
Jint fd = fdval (env, fdo );
Int result = 0;
Struct pollfd poller;
Poller. revents = 1;
If (! Ready ){
Poller. fd = fd;
Poller. events = POLLOUT;
Poller. revents = 0;
Result = poll (& poller, 1, block? -1: 0 );
If (result <0 ){
JNU_ThrowIOExceptionWithLastError (env, "Poll failed ");
Return IOS_THROWN;
}
If (! Block & (result = 0 ))
Return IOS_UNAVAILABLE;
}
If (poller. revents ){
Errno = 0;
Result = getsockopt (fd, SOL_SOCKET, SO_ERROR, & error, & n );
If (result <0 ){
HandleSocketError (env, errno );
Return JNI_FALSE;
} Else if (error ){
HandleSocketError (env, error );
Return JNI_FALSE;
}
Return 1;
}
Return 0;
}
6.0 the default model is epoll.
E: Java \ jdk-6-rc-src \ j2se \ src \ solaris \ native \ sun \ nio \ ch \ EPollArrayWrapper. c
JNIEXPORT void JNICALL
Java_sun_nio_ch_EPollArrayWrapper_init (JNIEnv * env, jclass this)
{
Epoll_create_func = (epoll_create_t) dlsym (RTLD_DEFAULT, "epoll_create ");
Epoll_ctl_func = (epoll_ctl_t) dlsym (RTLD_DEFAULT, "epoll_ctl ");
Epoll_wait_func = (epoll_wait_t) dlsym (RTLD_DEFAULT, "epoll_wait ");
If (epoll_create_func = NULL) | (epoll_ctl_func = NULL) |
(Epoll_wait_func = NULL )){
JNU_ThrowInternalError (env, "unable to get address of epoll functions, pre-2.6 kernel? ");
}
}
I am still not clear about the specific procedures, so I still need further understanding.
Wenshao logs comment