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 }
|