< prev index next >

src/java.base/windows/native/libnio/ch/WindowsSelectorImpl.c

Print this page
rev 53271 : 8216981: Per thread IO statistics in JFR


 181         resultbuf[i + 1] = (int)exceptfds.fd_array[i];
 182     }
 183     (*env)->SetIntArrayRegion(env, returnExceptFds, 0,
 184                               exceptfds.fd_count + 1, resultbuf);
 185 #else
 186     (*env)->SetIntArrayRegion(env, returnReadFds, 0,
 187                               readfds.fd_count + 1, (jint *)&readfds);
 188 
 189     (*env)->SetIntArrayRegion(env, returnWriteFds, 0,
 190                               writefds.fd_count + 1, (jint *)&writefds);
 191     (*env)->SetIntArrayRegion(env, returnExceptFds, 0,
 192                               exceptfds.fd_count + 1, (jint *)&exceptfds);
 193 #endif
 194     return 0;
 195 }
 196 
 197 JNIEXPORT void JNICALL
 198 Java_sun_nio_ch_WindowsSelectorImpl_setWakeupSocket0(JNIEnv *env, jclass this,
 199                                                 jint scoutFd)
 200 {

 201     /* Write one byte into the pipe */
 202     const char byte = 1;
 203     send(scoutFd, &byte, 1, 0);




 204 }
 205 
 206 JNIEXPORT void JNICALL
 207 Java_sun_nio_ch_WindowsSelectorImpl_resetWakeupSocket0(JNIEnv *env, jclass this,
 208                                                 jint scinFd)
 209 {
 210     char bytes[WAKEUP_SOCKET_BUF_SIZE];
 211     long bytesToRead;

 212 
 213     /* Drain socket */
 214     /* Find out how many bytes available for read */
 215     ioctlsocket (scinFd, FIONREAD, &bytesToRead);
 216     if (bytesToRead == 0) {
 217         return;
 218     }
 219     /* Prepare corresponding buffer if needed, and then read */
 220     if (bytesToRead > WAKEUP_SOCKET_BUF_SIZE) {
 221         char* buf = (char*)malloc(bytesToRead);
 222         recv(scinFd, buf, bytesToRead, 0);
 223         free(buf);
 224     } else {
 225         recv(scinFd, bytes, WAKEUP_SOCKET_BUF_SIZE, 0);



 226     }
 227 }
 228 
 229 JNIEXPORT jboolean JNICALL
 230 Java_sun_nio_ch_WindowsSelectorImpl_discardUrgentData(JNIEnv* env, jobject this,
 231                                                       jint s)
 232 {
 233     char data[8];
 234     jboolean discarded = JNI_FALSE;
 235     int n;
 236     do {
 237         n = recv(s, (char*)&data, sizeof(data), MSG_OOB);
 238         if (n > 0) {
 239             discarded = JNI_TRUE;
 240         }
 241     } while (n > 0);
 242     return discarded;
 243 }


 181         resultbuf[i + 1] = (int)exceptfds.fd_array[i];
 182     }
 183     (*env)->SetIntArrayRegion(env, returnExceptFds, 0,
 184                               exceptfds.fd_count + 1, resultbuf);
 185 #else
 186     (*env)->SetIntArrayRegion(env, returnReadFds, 0,
 187                               readfds.fd_count + 1, (jint *)&readfds);
 188 
 189     (*env)->SetIntArrayRegion(env, returnWriteFds, 0,
 190                               writefds.fd_count + 1, (jint *)&writefds);
 191     (*env)->SetIntArrayRegion(env, returnExceptFds, 0,
 192                               exceptfds.fd_count + 1, (jint *)&exceptfds);
 193 #endif
 194     return 0;
 195 }
 196 
 197 JNIEXPORT void JNICALL
 198 Java_sun_nio_ch_WindowsSelectorImpl_setWakeupSocket0(JNIEnv *env, jclass this,
 199                                                 jint scoutFd)
 200 {
 201     int written;
 202     /* Write one byte into the pipe */
 203     const char byte = 1;
 204     written = send(scoutFd, &byte, 1, 0);
 205 
 206     if (written > 0) {
 207         JVM_callFileWriteBytes(env, written);
 208     }
 209 }
 210 
 211 JNIEXPORT void JNICALL
 212 Java_sun_nio_ch_WindowsSelectorImpl_resetWakeupSocket0(JNIEnv *env, jclass this,
 213                                                 jint scinFd)
 214 {
 215     char bytes[WAKEUP_SOCKET_BUF_SIZE];
 216     long bytesToRead;
 217     int read;
 218 
 219     /* Drain socket */
 220     /* Find out how many bytes available for read */
 221     ioctlsocket (scinFd, FIONREAD, &bytesToRead);
 222     if (bytesToRead == 0) {
 223         return;
 224     }
 225     /* Prepare corresponding buffer if needed, and then read */
 226     if (bytesToRead > WAKEUP_SOCKET_BUF_SIZE) {
 227         char* buf = (char*)malloc(bytesToRead);
 228         read = recv(scinFd, buf, bytesToRead, 0);
 229         free(buf);
 230     } else {
 231         read = recv(scinFd, bytes, WAKEUP_SOCKET_BUF_SIZE, 0);
 232     }
 233     if (read > 0) {
 234         JVM_callNetworkReadBytes(env, read);
 235     }
 236 }
 237 
 238 JNIEXPORT jboolean JNICALL
 239 Java_sun_nio_ch_WindowsSelectorImpl_discardUrgentData(JNIEnv* env, jobject this,
 240                                                       jint s)
 241 {
 242     char data[8];
 243     jboolean discarded = JNI_FALSE;
 244     int n;
 245     do {
 246         n = recv(s, (char*)&data, sizeof(data), MSG_OOB);
 247         if (n > 0) {
 248             discarded = JNI_TRUE;
 249         }
 250     } while (n > 0);
 251     return discarded;
 252 }
< prev index next >